2010-12-09 11 views
2

Ich habe eine Sammlung namens Produkte, die ich mit dem offiziellen mongo-csharp-Treiber aufzählen möchte. Sobald ich jedoch versuche, die Sammlung aufzuzählen (z. B. mit einer foreach-Schleife), erhalte ich den folgenden Fehler.Kann über Objekte mit MongoDBRef nicht aufzählen

"Default Konstruktor nicht für Typ MongoDB.Driver.MongoDBRef gefunden"

Die Entity-Klasse sieht wie folgt aus

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; } 
} 

Der Eintrag in der Sammlung sieht wie folgt aus

{ 
    "_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") 
    } 
} 

Und ich lese es so ein.

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

Ich bekomme den Fehler nicht, bis ich eine der folgenden Möglichkeiten habe.

var l = matches.ToList(); 

ODER

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

Ich weiß, dass Sie die Entitätsklasse setzen, aber verbieten Sie ein oder zwei Beispieldokumente in Ihrer Frage? Es könnte helfen, dies neu zu erstellen. –

+0

Ich habe gerade die Frage aktualisiert, Prost Justin. – Alex

Antwort

2
  1. Verbindung Mongo db mongovue und überprüfen, dass die Sammlung und Daten vorhanden sind.
  2. anzeigen Code von

    var db = Db.Instance.GetDatabase();

sollte wie folgt sein:

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

und als yous Code:

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

3.I've Quelle für C# von Mongo-Treiber überprüft und ich fand folgende in MongoDBRef

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

Also ich schlage vor, dass in Ihrer Version von Mungo-Fahrer Jungs von Mongo C# -Treiber-Team über Standard-Konstruktor vergessen. Überprüfen Sie in jedem Fall, ob der Konstruktor existiert/nicht existiert unter Verwendung von reflector. 4. Und ich bin 99% sicher, dass der Konstruktor bei der Version des Mongo-Treibers nicht vorhanden ist. Denn wenn Sie beginnen, einige Mongo-Sammlung Mongo-Treiber zu enumerieren Daten gehen und für den Fall, wenn Standard-Konstruktor nicht gefunden wird, Fehler zu werfen.

+0

Entschuldigung, ich hätte erwähnen sollen, dass die Db.Instance.GetDatabase(); call ist ein Wrapper für die Aufrufe Create() und GetDatabase(). Ich kann auch bestätigen, dass die Sammlung und Daten in mongovue – Alex

+0

Ich habe meine Antwort aktualisiert. –

+0

Ich hatte Recht, es war Bug bei Mongodb, die gestern behoben wurde. Sie können Commit mit Fix hier sehen -> https://github.com/mongodb/mongo-csharp-driver/commit/d8b192797437e4d6e27d9aef8527dcb66961beba –