RavenDB中的循环引用问题

5

我正在使用RavenDB,其模型如下:

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

public class Item {
    public Cart Cart;
}

当我将一个Item添加到Cart时,我会连接两者之间的关系。 RavenDB如何处理此类的序列化和反序列化? 是否会自动分配对Cart的引用,或者有没有办法在加载时手动连接它?
2个回答

9

如果您保存购物车,调用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;
}

我想提一下,它确实被反序列化了。换句话说,当加载时,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

0

你可能想阅读这篇文章,以便更好地了解RavenDB在这些场景下的工作方式: http://ravendb.net/docs/theory/document-structure-design

在这种情况下,Item和Card实际上将被序列化为同一个文档,这可能不是你想要的。 在RavenDB中,引用应该只包括引用文档的ID,而不是文档本身。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接