2011-02-03 26 views
24

Tôi đang sử dụng chính thức MongoDB C# Drive v0.9.1.26831, nhưng tôi đã tự hỏi cho một lớp POCO, có anyway để bỏ qua các thuộc tính nhất định từ việc chèn vào.MongoDB C# Trình điều khiển: Bỏ qua thuộc tính trên Insert

Ví dụ, tôi có lớp sau đây:

public class GroceryList 
{ 
    public string Name { get; set; } 
    public FacebookList Owner { get; set; } 
    public bool IsOwner { get; set; } 
} 

Có cách nào, cho IsOwner để không bị chèn khi tôi chèn một đối tượng GroceryList? Về cơ bản, tôi lấy đối tượng từ cơ sở dữ liệu, sau đó thiết lập thuộc tính IsOwner trong lớp ứng dụng và sau đó trả nó trở lại bộ điều khiển, hơn là ánh xạ đối tượng vào một mô hình khung nhìn.

Hy vọng câu hỏi của tôi có ý nghĩa. cảm ơn!

+0

Bạn có giải quyết vấn đề của bạn? –

+0

Có, tôi đã sử dụng thuộc tính BsonIgnore trên thuộc tính IsOwner và giải quyết được sự cố. cảm ơn! – Abe

Trả lời

35

Dường như thuộc tính [BsonIgnore] đã thực hiện công việc.

public class GroceryList : MongoEntity<ObjectId> 
{ 
    public FacebookList Owner { get; set; } 
    [BsonIgnore] 
    public bool IsOwner { get; set; } 
} 
+0

đẹp, đã cứu ngày của tôi, cảm ơn. –

13

Ngoài ra bạn có thể làm IsOwner Nullable và thêm [BsonIgnoreExtraElements] đến lớp lỗ:

[BsonIgnoreExtraElements] 
public class GroceryList : MongoEntity<ObjectId> 
{ 
    public FacebookList Owner { get; set; } 
    public bool? IsOwner { get; set; } 
} 

tài sản với giá trị null sẽ bị bỏ qua trong searilization. Nhưng tôi nghĩ rằng [BsonIgnore] sẽ tốt hơn cho trường hợp của bạn.

+0

nếu tôi sử dụng cả [BsonIgnoreExtraElements] và [BsonIgnore] thì tất cả các thuộc tính có chú thích [BsonIgnore] sẽ bỏ qua bất kể giá trị nào trong khi phần còn lại có giá trị null cũng sẽ bị bỏ qua. Chính xác? – WSK

+0

@WSK [BsonIgnoreExtraElements] bỏ qua các trường từ db không nằm trong lớp của bạn khi tải tài liệu. Trường bỏ qua BsonIgnore khi tải/lưu tài liệu. –

4

Ngoài ra, nếu bạn không muốn sử dụng các thuộc tính đối với một số lý do (ví dụ trong trường hợp bạn không muốn mang lại một sự phụ thuộc thêm để MongoDB.Bson để DTO của bạn), bạn có thể làm như sau:

BsonClassMap.RegisterClassMap<GroceryList>(cm => 
{ 
    cm.AutoMap(); 
    cm.UnmapMember(m => m.IsOwner); 
}); 
1

Chỉ trong trường hợp ai đó có thể quan tâm đến một cách khác để thực hiện nó. Qua ước:

public class IgnoreSomePropertyConvention : ConventionBase, IMemberMapConvention 
{ 
    public void Apply(BsonMemberMap memberMap) 
    { // more checks will go here for the case above, e.g. type check 
     if (memberMap.MemberName != "DoNotWantToSaveThis") 
      memberMap.SetShouldSerializeMethod(o => false); 
    } 
} 

Và sau đó bạn cần phải đăng ký công ước này một lần trong bạn ứng dụng khởi động:

ConventionRegistry.Register("MyConventions", new ConventionPack { new IgnoreBaseIdConvention() }, t => true); 
1

Bạn có lẽ nên muốn kết hợp hai thuộc tính BsonIgnoreExtraElements và BsonIgnore. Lý do là mặc dù BsonIgnore sẽ không chèn thuộc tính "IsOwner" vào DB nhưng nếu bạn có các phiên bản "cũ" trong DB có chứa trường này và bạn sẽ xóa trường này khỏi mô hình của bạn trong đối tượng địa lý hoặc mở rộng " GroceryList" class và sử dụng lớp mới trong DB sẽ nhận được một ngoại lệ:

'Yếu tố 'IsOwner' không phù hợp với bất kỳ lĩnh vực hay tài sản của lớp'

Một cách khác (thay vì chỉnh sửa bạn model class) là sử dụng "Đăng ký lớp Bản đồ" với "SetIgnoreExtraElements" và "UnmapMember" với nhau.

Trong trường hợp của bạn chỉ cần thêm đoạn mã này khi bạn khởi tạo lái xe của bạn:

BsonClassMap.RegisterClassMap<UserModel>(cm => 
{ 
    cm.AutoMap(); 
    cm.SetIgnoreExtraElements(true); 
    cm.UnmapMember(m => m.IsOwner); 
}); 

Bạn có thể đọc thêm về Mongo Lớp Mapping trong:

http://mongodb.github.io/mongo-csharp-driver/2.0/reference/bson/mapping/

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