2012-10-17 31 views

Trả lời

17

Sử dụng SetIgnoreExtraElementsConvention phương pháp (từ ước phần của C# driver Serialization Tutorial):

var myConventions = new ConventionProfile(); 
myConventions.SetIgnoreExtraElementsConvention(new AlwaysIgnoreExtraElementsConvention())); 
BsonClassMap.RegisterConventions(myConventions, (type) => true); 

Tham số (type) => true là một vị tùy thuộc vào loại lớp, xác định xem có nên áp dụng quy ước. Vì vậy, theo yêu cầu của bạn, nó chỉ đơn giản là trả về true bất kể; nhưng bạn có thể sử dụng điều này để đặt/loại trừ quy ước trên các loại nhất định nếu bạn muốn.

Sửa

bình mỗi Evereq của, phía trên là lỗi thời. Bây giờ sử dụng:

var conventionPack = new ConventionPack { new IgnoreExtraElementsConvention(true) }; 
ConventionRegistry.Register("IgnoreExtraElements", conventionPack, type => true); 
+1

Tôi đã đọc tất cả tài liệu hôm nay và thậm chí không nhận thấy rằng đã có ** SetIgnoreExtraElementsConvention ** cảm ơn! Tôi sẽ kiểm tra mã này vào đầu ngày mai! –

+3

Trong phiên bản gần đây của MongoDB C# Trình điều khiển hầu hết các loại được sử dụng trong đoạn mã trên được đánh dấu là "lỗi thời". Vì vậy, cập nhật (và một chút nhỏ gọn hơn) mã sẽ là: 'bằng cách sử dụng MongoDB.Bson.Serialization.Conventions; ConventionRegistry.Register ("IgnoreExtraElements", mới ConventionPack {new IgnoreExtraElementsConvention (true)}, gõ => true); ' – Evereq

+2

@Evereq cảm ơn. Tôi đã chỉnh sửa câu trả lời của tôi bằng cách sửa chữa của bạn, nếu đó là ok với bạn. – McGarnagle

1

Về cơ bản,

MongoDB dành cho bạn khả năng lưu trữ tài liệu trong một bộ sưu tập duy nhất mỗi có thể có sơ đồ của riêng mình. Đây là một thay đổi mạnh mẽ nếu bạn có một nền tảng trong cơ sở dữ liệu quan hệ. Trong một cơ sở dữ liệu quan hệ, bạn có một lược đồ tĩnh trên mỗi bảng và bạn không thể đi chệch khỏi mà không thay đổi cấu trúc của bảng. Trong ví dụ dưới đây, tôi đã định nghĩa một lớp Person và một lớp PersonWithBirthDate xuất phát từ lớp Person. Cả hai có thể được lưu trữ trong cùng một bộ sưu tập trong cơ sở dữ liệu mongoDB. Trong trường hợp này, giả sử các tài liệu được lưu trữ trong bộ sưu tập Persons.

Xem mã mẫu -

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class PersonWithBirthDate : Person 
{ 
    public DateTime DateOfBirth { get; set; } 
} 

Bây giờ, bạn có thể dễ dàng lấy và các văn bản và có MongoDB C# driver deserialze tài liệu vào lớp PersonWithBirthDate. Tuy nhiên, bạn sẽ gặp phải các vấn đề nếu bạn truy vấn bộ sưu tập Persons và cố gắng để trình điều khiển deserialize dữ liệu vào lớp Person. Bạn sẽ nhận được một lỗi rằng có những yếu tố không thể được deserialized. Điều này dễ dàng sửa chữa bằng cách thêm thuộc tính [BsonIgnoreExtraElements] vào lớp Person. Bạn có thể thấy lớp được sửa đổi bên dưới. Điều này sẽ hướng dẫn trình điều khiển bỏ qua bất kỳ phần tử nào mà nó không thể deserialize vào một thuộc tính tương ứng. Với thuộc tính, bất kỳ tài liệu nào trong bộ sưu tập Persons đều có thể được deserailized thành lớp Person mà không có lỗi.

[BsonIgnoreExtraElements] 
public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class PersonWithBirthDate : Person 
{ 
    public DateTime DateOfBirth { get; set; } 
} 

Tôi hy vọng điều này sẽ giúp bạn hiểu rõ hơn.

+0

Điều này không trả lời được câu hỏi nào cả. Mặc dù đây là lời giải thích tốt về những gì mà BsonIgnoreExtraElements thực hiện là – Steve

+0

nó trả lời ** BsonIgnoreExtraElements ** là gì, giống như nó. – Jeb50

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