2010-12-09 2 views
2

J'ai une collection appelée produits que j'essaie d'énumérer en utilisant le pilote mongo-csharp officiel. Cependant, dès que j'essaie d'énumérer la collection (par exemple avec une boucle foreach), j'obtiens l'erreur suivante.Impossible d'énumérer des objets avec MongoDBRef

"constructeur par défaut introuvable pour le type MongoDB.Driver.MongoDBRef"

La classe entité se présente comme suit

public partial class Product 
{ 
    public BsonObjectId _id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string Url { get; set; } 
    public int Price { get; set; } 
    public string Country { get; set; } 
    public MongoDBRef Merchant { get; set; } 
} 

L'entrée dans la collection se présente comme suit

{ 
    "_id" : ObjectId("4cff739fba63c20301ee5bc5"), 
    "Name" : "Product Name", 
    "Description" : "Product Description", 
    "Url" : "http://mysite/products/product-name", 
    "Price" : 1200, 
    "Country" : "au", 
    "Merchant" : { 
     "$ref" : "Merchant", 
     "$id" : ObjectId("533981033d565e640d000000") 
    } 
} 

Et je le lis comme ça.

var db = Db.Instance.GetDatabase(); 
var matches = db.GetCollection<Product>("Product").FindAll(); 

Je n'obtiens pas l'erreur tant que je n'ai effectué aucune des opérations suivantes.

var l = matches.ToList(); 

OU

foreach (var p in matches) { 
    // Do something 
} 
+0

Je sais que vous mettez la classe d'entité, mais vous interdisez de fournir un exemple de document ou deux dans votre question? Cela pourrait aider à recréer cela. –

+0

Je viens de mettre à jour la question à la satisfaction de Justin. – Alex

Répondre

2
  1. Connectez-vous à l'aide mongo db mongovue et vérifier que la collecte et des données existe.
  2. code Show of

    var db = Db.Instance.GetDatabase();

devrait être quelque chose comme ceci:

var server = MongoServer.Create("mongodb://localhost:27019"); 
var db = server.GetDatabase("database_name"); 

et que yous code:

var matches = db.GetCollection<Product>("Product").FindAll(); 

3.I've vérifié source de pilote pour mongo C# et j'ai trouvé à MongoDBRef

// default constructor is private and only used for deserialization 
    private MongoDBRef() { 
    } 

Donc, je suggère que dans votre version du pilote mongo gars de mongo C# l'équipe du pilote a oublié le constructeur par défaut. De toute façon vérifier s'il vous plaît que constructeur existe/n'existe pas en utilisant reflector. 4. Et je suis sûr à 99% que le constructeur n'est pas présent dans votre version du pilote mongo. Parce que quand vous commencez à énumérer certains pilotes mongo collection mongo va désiréaliser les données et dans le cas où le constructeur par défaut ne trouve pas d'erreur.

+0

Désolé, j'aurais dû mentionner que Db.Instance.GetDatabase(); call est un wrapper pour les appels Create() et GetDatabase(). Je peux également confirmer que la collection et les données existent dans mongovue – Alex

+0

J'ai mis à jour ma réponse. –

+0

J'avais raison, c'était bug à mongodb qui a été corrigé hier. Vous pouvez voir commettre avec fixer ici -> https://github.com/mongodb/mongo-csharp-driver/commit/d8b192797437e4d6e27d9aef8527dcb66961beba –

Questions connexes