Circular References in RavenDB
c#, circular-reference, ravendb
Solution
If you save cart you will get an exception 'Self referencing loop detected...' when you call `SaveChanges()`.
The fix is easy. You add the `[JsonObject(IsReference = true)]` attribute to Cart. This tells the serializer to store Item's Cart as a reference instead of as a new object.
[JsonObject(IsReference = true)]
public class Cart
{
public List<Item> Items = new List<Item>();
}
public class Item
{
public Cart Cart;
}
I also wanted to mention that it IS property deserialized. In other words, Cart is re-assigned to Item when it is loaded.
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
Problem
I'm using RavenDB with models like: ``` public class Cart { List<Item> Items = new List<Item>(); } public class Item { public Cart Cart; } ``` When I add an `Item` to a `Cart`, I wire up both sides of the relationship. How does RavenDB handle serializing & deserializing this? Will the reference to `Cart` be assigned automatically or is there a way to manually wire it on load?