2012-08-23 6 views
5

Ich versuche, eine generische Methode zu bauen all mein Teil-Updates über MongoDB C# Fahrer zu handhaben, mit dem folgende Verfahren:Teil-Aktualisierung in MongoDB C# Driver - Wörterbuch Ausgabe

public bool UpdateObject<T>(UpdatableObject<T> updatableObject) 
    where T : new() 
{ 
    var builder = GenerateMongoUpdateBuilder(updatableObject.ModifiedFields); 
    var collection = GetCollection<T>(); 
    var result = collection.Update(Query.EQ("_id", BsonValue.Create(updatableObject.Id)), builder, new MongoUpdateOptions { Flags = UpdateFlags.Multi }); 
    return result.UpdatedExisting; 
} 

private static UpdateBuilder GenerateMongoUpdateBuilder(Dictionary<string, object> modifiedFields) 
{ 
    var builder = new UpdateBuilder(); 
    foreach (var modifiedField in modifiedFields) 
    { 
     var type = modifiedField.Value.GetType(); 
     if (type.IsPrimitive || type.IsValueType || (type == typeof(string))) 
     { 
      builder.Set(modifiedField.Key, BsonValue.Create(modifiedField.Value)); 
     } 
     else 
     { 
      builder.Set(modifiedField.Key, modifiedField.Value.ToBsonDocument()); 
     } 
    } 
    return builder; 
} 

Ich hatte für ein kämpfen solange bis ich die Lösung gefunden habe, primitive Typen über BsonValue und nicht-primitive Typen über BsonDocument zu behandeln. Alles hat gut funktioniert, bis ... Wir haben ein Objekt erstellt, das ein Wörterbuch enthält. Die Einfügung funktioniert perfekt, aber sobald sie in das Update (mit dieser Methode) geht, kann sie nicht mehr deserialisiert werden. Ein Blick auf das Objekt im Mongo vor und nach dem Update zeigt an, dass es nicht mehr das gleiche Objekt ist - nach dem Update hat es ein zusätzliches _t-Feld für "System.Collections.Generic.Dictionary`2 [System.String, [SomeObject, SomeObjectAssembly] ]“

So beginne ich meine Implementierung ...

Jede Idee, was mache ich falsch in Frage zu stellen?

Danke, Nir.

+0

Das klingt sehr nach einem Fehler. Ich schlage vor, Sie erhalten bessere Repro-Anweisungen und gehen zu ihrer [jira-Site] (https://jira.mongodb.org/browse/CSHARP), um sie zu melden. – kelloti

+0

Was bedeutet Dictionary , wenn Sie das tun. ToBsonDocument() drauf? –

+0

Das ist das Ergebnis: {"_t": "System.Collections.Generic.Dictionary'2 [System.String, [SomeObject, SomeObjectdll]]", "_v": {"f5030d52-cd70-404f-a3b4-072b6261e2c3" : {"_id": 0, "Name": "Test"}, ... weitere Einträge hier ... – nirpi

Antwort

0

Mit der Höflichkeit von Robert Stam wurde das Problem behoben. Es ist alles in der Jira Artikel beschrieben. Vielen Dank!