RavenDB中的循环引用

时间:2012-04-09 03:36:47

标签: c# ravendb circular-reference

我正在使用RavenDB和以下模型:

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

public class Item {
    public Cart Cart;
}

当我向Item添加Cart时,我会将关系的两边连接起来。

RavenDB如何处理序列化&amp;反序列化?是否会自动分配对Cart的引用,或者有没有办法在加载时手动连接它?

2 个答案:

答案 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,而不是文档本身。