我正在使用RavenDB,其模型如下:
public class Cart {
List<Item> Items = new List<Item>();
}
public class Item {
public Cart Cart;
}
当我将一个
Item
添加到Cart
时,我会连接两者之间的关系。
RavenDB如何处理此类的序列化和反序列化? 是否会自动分配对Cart
的引用,或者有没有办法在加载时手动连接它?我正在使用RavenDB,其模型如下:
public class Cart {
List<Item> Items = new List<Item>();
}
public class Item {
public Cart Cart;
}
Item
添加到Cart
时,我会连接两者之间的关系。
RavenDB如何处理此类的序列化和反序列化? 是否会自动分配对Cart
的引用,或者有没有办法在加载时手动连接它?如果您保存购物车,调用SaveChanges()
时会出现异常“检测到自引用循环...”。
解决方法很简单。您可以在Cart中添加[JsonObject(IsReference = true)]
属性。这将告诉序列化程序将Item的Cart存储为引用,而不是作为新对象。
[JsonObject(IsReference = true)]
public class Cart
{
public List<Item> Items = new List<Item>();
}
public class Item
{
public Cart Cart;
}
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
你可能想阅读这篇文章,以便更好地了解RavenDB在这些场景下的工作方式: http://ravendb.net/docs/theory/document-structure-design
在这种情况下,Item和Card实际上将被序列化为同一个文档,这可能不是你想要的。 在RavenDB中,引用应该只包括引用文档的ID,而不是文档本身。