2012-08-23 2 views
5

Je suis en train de construire une méthode générique pour gérer toutes mes mises à jour partielles via le pilote MongoDB C#, en utilisant la méthode suivante:mise à jour partielle dans MongoDB C# Pilote - problème Dictionnaire

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

je devais lutter pour une Jusqu'à ce que je trouve la solution pour gérer les types primitifs via BsonValue et les types non-primitifs via BsonDocument. Tout a bien fonctionné, jusqu'à ... Nous avons créé un objet qui contient un dictionnaire. L'insertion fonctionne parfaitement, mais une fois mise à jour (en utilisant cette méthode), elle ne peut plus être désérialisée. Regarder l'objet dans le Mongo avant et après la mise à jour indique que ce n'est plus le même objet - après la mise à jour, le champ _t supplémentaire contient "System.Collections.Generic.Dictionary`2 [System.String, [SomeObject, SomeObjectAssembly] ] »

Alors je commence à remettre en question ma ... la mise en œuvre

Toute idée de ce que je fais mal?

Merci, Nir.

+0

Cela ressemble beaucoup à un bug. Je vous suggère d'obtenir de meilleures instructions de reprographie et de vous rendre sur leur [site jira] (https://jira.mongodb.org/browse/CSHARP) pour le signaler – kelloti

+0

Qu'est-ce que Dictionary finit comme quand vous le faites. ToBsonDocument() dessus? –

+0

Ceci est le résultat: {"_t": "System.Collections.Generic.Dictionary'2 [System.String, [SomeObject, SomeObjectdll]]", "_v": {"f5030d52-cd70-404f-a3b4-072b6261e2c3" : {"_id": 0, "Nom": "Test"}, ... des entrées supplémentaires ici ... – nirpi

Répondre

0

Avec l'aimable autorisation de Robert Stam, le problème a été résolu. Tout est décrit dans l'article de Jira. Merci!

Questions connexes