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.
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
Qu'est-ce que Dictionary finit comme quand vous le faites. ToBsonDocument() dessus? –
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