我正在尝试使用以下方法构建一个通用方法来通过 MongoDB C# 驱动程序处理我的所有部分更新:
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;
}
我不得不挣扎了一段时间,直到找到了通过 BsonValue 处理原始类型和通过 BsonDocument 处理非原始类型的解决方案。一切运行良好,直到...我们创建了一个包含字典的对象。插入工作完美,但一旦进入更新(使用此方法) - 它就不能再反序列化了。在更新前后查看 Mongo 中的对象表明它不再是同一个对象 - 更新后它有额外的 _t 字段包含“System.Collections.Generic.Dictionary`2[System.String,[SomeObject, SomeObjectAssembly] ]"
所以我开始质疑我的实施......
知道我在做什么错吗?
谢谢,尼尔。