MongoDB C#驱动程序中的部分更新-字典问题

MongoDB C#驱动程序中的部分更新-字典问题,c#,mongodb,dictionary,partial,C#,Mongodb,Dictionary,Partial,我正在尝试通过MongoDB C#driver构建一个通用方法来处理我的所有部分更新,方法如下: public bool UpdateObject<T>(UpdatableObject<T> updatableObject) where T : new() { var builder = GenerateMongoUpdateBuilder(updatableObject.ModifiedFields); var collection = GetC

我正在尝试通过MongoDB C#driver构建一个通用方法来处理我的所有部分更新,方法如下:

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;
}
public bool UpdateObject(可更新对象可更新对象)
其中T:new()
{
var builder=GenerateMongoUpdateBuilder(updateObject.ModifiedFields);
var collection=GetCollection();
var result=collection.Update(Query.EQ(“_id”,BsonValue.Create(updateableobject.id)),builder,new-MongoUpdateOptions{Flags=UpdateFlags.Multi});
返回result.updateexisting;
}
专用静态UpdateBuilder GenerateMongoUpdateBuilder(字典修改字段)
{
var builder=new UpdateBuilder();
foreach(modifiedFields中的var modifiedField)
{
var type=modifiedField.Value.GetType();
if(type.IsPrimitive | | type.IsValueType | | |(type==typeof(string)))
{
Set(modifiedField.Key,BsonValue.Create(modifiedField.Value));
}
其他的
{
Set(modifiedField.Key,modifiedField.Value.ToBsonDocument());
}
}
返回生成器;
}
我不得不挣扎了一段时间,直到找到了通过BsonValue处理基本类型和通过BsonDocument处理非基本类型的解决方案。一切都很顺利,直到…我们创建了一个可以保存字典的对象。insert工作得很好,但一旦进入更新(使用此方法),就不能再进行反序列化。在更新前后查看Mongo中的对象表明它不再是同一个对象-在更新后,它有额外的字段保存“System.Collections.Generic.Dictionary`2[System.String,[SomeObject,SomeObjectAssembly]”

所以我开始质疑我的实现

知道我做错了什么吗

谢谢,
Nir。

在罗伯特·斯塔姆的帮助下,问题得以解决。这都在Jira项目中描述过。
谢谢大家!

这听起来很像一只虫子。我建议您获得更好的重新编写说明,并前往他们的报告。当您对字典执行.ToBsonDocument()操作时,它的结果是:{“\t”:“System.Collections.Generic.Dictionary`2[System.String,[SomeObject,SomeObjectdll]]”,“\v”:{“f530d52-cd70-404f-a3b4-072b6261e2c3”:{“id”:0,“Name”:“Test”},…此处有其他条目…@kelloti-谢谢,我在Jira网站上发布了一个问题: