5

我将 RavenDB 与以下模型一起使用:

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

public class Item {
    public Cart Cart;
}

当我将 an 添加Item到 aCart时,我将关系的双方联系起来。

RavenDB 如何处理序列化和反序列化? 是自动分配参考Cart还是有办法在负载时手动连接它?

4

2 回答 2

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;
}

我还想提一下它是反序列化的属性。换句话说,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
于 2012-04-09T14:27:27.687 回答
0

您可能想阅读这篇文章以了解 RavenDB 在这些场景中的工作原理: http ://ravendb.net/docs/theory/document-structure-design

在这种情况下,Item & Card 实际上会被序列化到 SAME 文档中,这可能不是您想要的。RavenDB 中的引用应该包含引用文档的 id,而不是文档本身。

于 2012-04-09T06:28:10.063 回答