2012-08-23 10 views
5

私は次のメソッドを使用して、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] ]」だから私は私の実装に疑問を始めている

...

私が間違っているの何任意のアイデア?

ありがとう、 Nir。

+0

これはバグのように聞こえます。私はあなたがより良いrepro命令を得て、それを報告するために彼らの[jiraサイト](https://jira.mongodb.org/browse/CSHARP)に向かうことをお勧めします。 – kelloti

+0

Dictionary と同じように終わります。それにToBsonDocument()? –

+0

これは結果です。{"_t": "System.Collections.Generic.Dictionary'2 [System.String、[SomeObject、SomeObjectdll]]"、 "_v":{"f5030d52-cd70-404f-a3b4-072b6261e2c3" :{"_id":0、 "Name": "Test"}、...ここに追加エントリ... – nirpi

答えて

0

Robert Stamの礼儀で、この問題は解決されました。それはすべてJira項目に記載されています。 ありがとうございました!