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
的引用是自动分配的,还是有办法在加载时手动连接?
如果您保存购物车,您将收到异常"检测到自引用循环..."当你打电话给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,而不是文档本身。