2012-08-23 25 views
5

मैं निम्नलिखित पद्धति का उपयोग करके, MongoDB सी # ड्राइवर के माध्यम से अपने सभी आंशिक अपडेट प्रबंधित करने की एक सामान्य विधि का निर्माण करने की कोशिश कर रहा हूँ:आंशिक अपडेट - शब्दकोश मुद्दा

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 के माध्यम से आदिम प्रकारों को संभालने का समाधान नहीं मिला। सबकुछ ठीक से काम करता है, जब तक ... हमने एक वस्तु बनाई है जिसमें एक शब्दकोश है। सम्मिलन पूरी तरह से काम करता है, लेकिन एक बार यह अद्यतन में जाता है (इस विधि का उपयोग करके) - इसे और अधिक deserialized नहीं किया जा सकता है। अद्यतन से पहले और बाद में मोंगो में ऑब्जेक्ट को देखते हुए इंगित करता है कि यह अब एक ही ऑब्जेक्ट नहीं है - अपडेट के बाद इसमें अतिरिक्त _t फ़ील्ड है "System.Collections.Generic.Dictionary`2 [System.String, [SomeObject, SomeObjectAssembly] ] "

तो मैं अपने कार्यान्वयन पर सवाल उठाने शुरू कर ...

किसी भी विचार क्या मैं गलत कर रहा हूँ?

धन्यवाद, नियर।

+0

यह एक बग की तरह लगता है। मेरा सुझाव है कि आपको बेहतर रेपो निर्देश प्राप्त करें और उनकी [जिरा साइट] (https://jira.mongodb.org/browse/CSHARP) पर रिपोर्ट करें – kelloti

+0

शब्दकोश आपके द्वारा किए जाने पर समाप्त होता है। ToBsonDocument() पर? –

+0

यह परिणाम है: {"_t": "System.Collections.Generic.Dictionary'2 [System.String, [SomeObject, SomeObjectdll]]", "_v": {"f5030d52-cd70-404f-a3b4-072b6261e2c3" : {"_id": 0, "नाम": "टेस्ट"}, ... यहां अतिरिक्त प्रविष्टियां ... – nirpi

उत्तर

0

रॉबर्ट स्टैम की सौजन्य के साथ, इस मुद्दे को हल किया गया था। यह सब जिरा आइटम में वर्णित है। धन्यवाद!