2012-04-09 33 views
5

Tôi đang sử dụng RavenDB với các mô hình như:Thông tư liệu tham khảo trong RavenDB

public class Cart { 
    List<Item> Items = new List<Item>(); 
} 

public class Item { 
    public Cart Cart; 
} 

Khi tôi thêm một Item đến một Cart, tôi dây lên cả hai mặt của mối quan hệ.

Làm thế nào để RavenDB xử lý tuần tự & deserializing? Tham chiếu đến Cart có được chỉ định tự động hay không hoặc có cách nào để tự gắn dây khi tải theo cách thủ công không?

Trả lời

9

Nếu bạn lưu giỏ hàng, bạn sẽ nhận được ngoại lệ 'Vòng lặp tham chiếu tự phát hiện ...' khi bạn gọi SaveChanges().

Việc sửa chữa rất dễ dàng. Bạn thêm thuộc tính [JsonObject(IsReference = true)] vào giỏ hàng. Điều này cho serializer lưu trữ Item's Cart như một tham chiếu thay vì là một đối tượng mới.

[JsonObject(IsReference = true)] 
public class Cart 
{ 
    public List<Item> Items = new List<Item>(); 
} 

public class Item 
{ 
    public Cart Cart; 
} 

Tôi cũng muốn đề cập rằng đó là tài sản được deserialized. Nói cách khác, Cart được gán lại cho Item khi nó được nạp.

var cart = new Cart(); 
cart.Items.Add(new Item { Cart = cart }); 
session.Store(cart); 
session.SaveChanges(); 

... 

var cart = session.Query<Cart>().First(); 
Assert.ReferenceEquals(cart, cart.Items.First().Cart); //this works 
0

Bạn có thể muốn đọc để có được một xử lý về cách RavenDB làm việc trong những tình huống: http://ravendb.net/docs/theory/document-structure-design

Trong trường hợp này, khoản & Thẻ sẽ thực sự được tuần tự vào cùng một tài liệu, trong đó có khả năng không phải những gì bạn muốn. Tài liệu tham khảo trong RavenDB phải bao gồm chỉ id của tài liệu tham chiếu chứ không phải tài liệu.

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