我正在使用RavenDB和以下模型:
public class Cart {
List<Item> Items = new List<Item>();
}
public class Item {
public Cart Cart;
}
当我向Item
添加Cart
时,我会将关系的两边连接起来。
RavenDB如何处理序列化&amp;反序列化?是否会自动分配对Cart
的引用,或者有没有办法在加载时手动连接它?
答案 0 :(得分:9)
如果您保存购物车,当您拨打SaveChanges()
时,您将收到“检测到自我引用循环...”的异常。
修复很简单。您将[JsonObject(IsReference = true)]
属性添加到购物车。这告诉序列化程序将Item的Cart存储为引用而不是新对象。
[JsonObject(IsReference = true)]
public class Cart
{
public List<Item> Items = new List<Item>();
}
public class Item
{
public Cart Cart;
}
我还想提一下,它是属性反序列化的。换句话说,Cart在加载时会重新分配给Item。
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
答案 1 :(得分:0)
您可能希望阅读本文以了解RavenDB如何在这些场景中工作: http://ravendb.net/docs/theory/document-structure-design
在这种情况下,Item&amp;卡实际上会被序列化到SAME文档中,这可能不是您想要的。 RavenDB中的引用应该包含只是引用文档的id,而不是文档本身。