2012-04-09 32 views
5

estoy usando RavenDB con modelos como:referencias circulares en RavenDB

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

public class Item { 
    public Cart Cart; 
} 

Cuando agrego una Item a un Cart, puedo conectar a ambos lados de la relación.

¿Cómo maneja RavenDB serializando & deserializando esto? ¿La referencia a Cart se asignará automáticamente o hay alguna forma de cablearla manualmente en la carga?

Respuesta

9

Si guarda el carro obtendrá una excepción 'Se detectó un bucle de autoreferencia ...' cuando llame al SaveChanges().

La solución es fácil. Agregue el atributo [JsonObject(IsReference = true)] al carro. Esto le dice al serializador que guarde el carrito del artículo como referencia en lugar de guardarlo como un nuevo objeto.

[JsonObject(IsReference = true)] 
public class Cart 
{ 
    public List<Item> Items = new List<Item>(); 
} 

public class Item 
{ 
    public Cart Cart; 
} 

También quería mencionar que es propiedad deserializada. En otras palabras, Cart se vuelve a asignar a Item cuando se carga.

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 
0

es probable que desee leer esto para tener una idea de cómo RavenDB trabaja en esos escenarios: http://ravendb.net/docs/theory/document-structure-design

En este caso, artículo & tarjeta en realidad se va a serializar en el mismo documento, lo que probablemente no es lo que querer. Las referencias en RavenDB deben incluir solo la identificación del documento de referencias, no el documento en sí.

Cuestiones relacionadas