RavenDB 中的循环引用

本文关键字:引用 循环 RavenDB | 更新日期: 2023-09-27 18:30:30

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

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

当我在Cart中添加Item时,我会将关系的双方联系起来。

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

RavenDB 中的循环引用

如果您保存购物车,您将收到异常"检测到自引用循环..."当你打电话给SaveChanges().

修复很容易。将[JsonObject(IsReference = true)]属性添加到购物车。这会告诉序列化程序将项目的购物车存储为引用,而不是新对象。

[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 实际上会被序列化为 SAME 文档,这可能不是您想要的。RavenDB 中的引用应包含引用文档的 ID,而不是文档本身。