RavenDB中的循环引用

ben*_*ree 5 c# circular-reference ravendb

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

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

public class Item {
    public Cart Cart;
}
Run Code Online (Sandbox Code Playgroud)

当我添加Item到a时Cart,我将关系的两侧连接起来.

RavenDB如何处理序列化和反序列化? 引用Cart是自动分配还是有方法在加载时手动连接?

ben*_*ree 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;
}
Run Code Online (Sandbox Code Playgroud)

我还想提一下,它是属性反序列化的.换句话说,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
Run Code Online (Sandbox Code Playgroud)