2012-08-23 25 views
5

Tôi đang cố gắng để xây dựng một phương pháp tổng quát để xử lý tất cả các cập nhật một phần của tôi qua MongoDB C lái xe #, sử dụng phương pháp sau đây:Cập nhật phần trong MongoDB C# Driver - từ điển vấn đề

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; 
} 

Tôi đã phải đấu tranh cho một trong khi cho đến khi tôi tìm ra giải pháp để xử lý các kiểu nguyên thủy thông qua các kiểu BsonValue và không nguyên thủy thông qua BsonDocument. Mọi thứ đã hoạt động tốt, cho đến khi ... Chúng tôi đã tạo một đối tượng chứa từ điển. Chèn hoạt động hoàn hảo, nhưng một khi nó đi vào bản cập nhật (sử dụng phương pháp này) - nó không thể được deserialized nữa. Nhìn vào đối tượng trong Mongo trước và sau khi cập nhật chỉ ra rằng nó không phải là cùng một đối tượng nữa - sau khi cập nhật nó có thêm trường _t giữ "System.Collections.Generic.Dictionary`2 [System.String, [SomeObject, SomeObjectAssembly] ]"

Vì vậy, tôi bắt đầu đặt câu hỏi về thực hiện của tôi ...

Bất kỳ ý tưởng những gì tôi làm sai?

Xin cảm ơn, Nir.

+0

Điều đó nghe có vẻ giống như một lỗi. Tôi đề nghị bạn nên có hướng dẫn repro tốt hơn và đi đến [jira site] của họ (https://jira.mongodb.org/browse/CSHARP) để báo cáo nó – kelloti

+0

Từ điển sẽ kết thúc như thế nào khi bạn làm vậy. ToBsonDocument() trên đó? –

+0

Đây là kết quả: {"_t": "System.Collections.Generic.Dictionary'2 [System.String, [SomeObject, SomeObjectdll]]", "_v": {"f5030d52-cd70-404f-a3b4-072b6261e2c3" : {"_id": 0, "Tên": "Kiểm tra"}, ... mục bổ sung tại đây ... – nirpi

Trả lời

0

Với sự lịch sự của Robert Stam, vấn đề đã được giải quyết. Tất cả được mô tả trong mục Jira. Cảm ơn bạn!

Các vấn đề liên quan