カートを保存すると、 を呼び出したときに「自己参照ループが検出されました...」という例外が発生します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