2012-04-09 21 views
5

sto usando RavenDB con modelli come:riferimenti circolari in RavenDB

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

public class Item { 
    public Cart Cart; 
} 

Quando aggiungo un Item ad un Cart, mi cablare entrambi i lati della relazione.

In che modo RavenDB gestisce la serializzazione & deserializzando questo? Il riferimento a Cart sarà assegnato automaticamente o c'è un modo per collegarlo manualmente al carico?

risposta

9

Se si salva il carrello, verrà visualizzata un'eccezione 'Ciclo di autoriferimento rilevato ...' quando si chiama SaveChanges().

La soluzione è semplice. Aggiungi l'attributo [JsonObject(IsReference = true)] al carrello. Questo dice al serializzatore di memorizzare il carrello dell'articolo come riferimento invece che come nuovo oggetto.

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

public class Item 
{ 
    public Cart Cart; 
} 

Volevo anche menzionare che è proprietà deserializzata. In altre parole, il carrello viene nuovamente assegnato all'elemento quando viene caricato.

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

probabilmente si desidera leggere questo per ottenere una maniglia su come RavenDB lavora in questi scenari: http://ravendb.net/docs/theory/document-structure-design

In questo caso, punto & Carta sarebbe in realtà essere serializzato nel documento stesso, il che è probabile che non quello che si volere. I riferimenti in RavenDB dovrebbero includere solo l'id del documento di riferimento, non il documento stesso.

Problemi correlati