我将 RavenDB 与以下模型一起使用:
public class Cart {
List<Item> Items = new List<Item>();
}
public class Item {
public Cart Cart;
}
当我将 an 添加Item
到 aCart
时,我将关系的双方联系起来。
RavenDB 如何处理序列化和反序列化? 是自动分配参考Cart
还是有办法在负载时手动连接它?
我将 RavenDB 与以下模型一起使用:
public class Cart {
List<Item> Items = new List<Item>();
}
public class Item {
public Cart Cart;
}
当我将 an 添加Item
到 aCart
时,我将关系的双方联系起来。
RavenDB 如何处理序列化和反序列化? 是自动分配参考Cart
还是有办法在负载时手动连接它?
如果您保存购物车,您将在调用时收到异常“检测到自引用循环...” 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
您可能想阅读这篇文章以了解 RavenDB 在这些场景中的工作原理: http ://ravendb.net/docs/theory/document-structure-design
在这种情况下,Item & Card 实际上会被序列化到 SAME 文档中,这可能不是您想要的。RavenDB 中的引用应该只包含引用文档的 id,而不是文档本身。