2013-11-26 15 views
9

Ich versuche, ein Dokument in MongoDB 2.4.4 mithilfe des .NET-Treibers aufzustocken. Es scheint nicht automatisch die _id auf Upserts zu generieren, obwohl es die _id auf Plain-Einsätze korrekt generiert. Wie kann ich den Treiber veranlassen, den _id richtig zu erzeugen?MongoDB .NET nicht generieren _id auf Upsert

Hier ist ein kleines Beispiel, das das Problem veranschaulicht.

public class MongoObject 
{ 
    [BsonId(IdGenerator = typeof(StringObjectIdGenerator))] 
    [BsonRepresentation(BsonType.ObjectId)] 
    public string MongoID { get; set; } 

    public int Index { get; set; } 
} 

var obj = new MongoObject() 
{ 
    Index = 1 
}; 

//This inserts the document, but with a _id set to Null 
_collection.Update(Query.EQ("Index", BsonValue.Create(1)), Update.Replace(obj), UpdateFlags.Upsert, new WriteConcern() { Journal = true }); 

//This inserts the document with the expected autogenerated _id 
//_collection.Insert(obj); 
+0

Ich bin gespannt, wofür der Downvote war? Da jemand zwei andere Fragen, die ich selbst beantwortet habe, einfach durchgegangen ist, möchte ich nur darauf hinweisen, dass dies tatsächlich eine vollständig unterstützte Funktion von StackOverflow ist. Es gibt sogar ein Kontrollkästchen für "Beantworte deine eigene Frage - teile deinen Wissens-Q & A-Stil" im "Frage stellen" -Formular. –

+0

Karma restauriert. Dies ist eine nützliche Frage mit einer nützlichen Antwort. – RobD

+0

Ha, danke @RobD :) –

Antwort

17

Und natürlich finde ich die Antwort sofort nach dem Posten der Frage. Von this answer besteht die Lösung darin, der ID ein [BsonIgnoreIfDefault]-Attribut hinzuzufügen. In dem Beispiel aus der Frage wäre es:

public class MongoObject 
{ 
    [BsonId(IdGenerator = typeof(StringObjectIdGenerator))] 
    [BsonRepresentation(BsonType.ObjectId)] 
    [BsonIgnoreIfDefault] // <--- this is what was missing 
    public string MongoID { get; set; } 

    public int Index { get; set; } 
}