2012-04-09 21 views
5

Ich verwende RavenDB mit Modellen wie:Rund Referenzen in RavenDB

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

public class Item { 
    public Cart Cart; 
} 

Wenn ich ein Item zu einem Cart hinzufügen, ich beiden Seiten der Beziehung verdrahten.

Wie behandelt RavenDB Serialisierung & deserializing dies? Wird die Referenz auf Cart automatisch zugewiesen oder gibt es eine Möglichkeit, sie manuell unter Last zu verdrahten?

Antwort

9

Wenn Sie den Warenkorb speichern, erhalten Sie beim Aufruf SaveChanges() die Ausnahme 'Selbstreferenzierungsschleife erkannt ...'.

Die Lösung ist einfach. Sie fügen das Attribut [JsonObject(IsReference = true)] zu Einkaufswagen hinzu. Dies weist den Serializer an, den Einkaufswagen des Elements als Referenz anstatt als neues Objekt zu speichern.

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

public class Item 
{ 
    public Cart Cart; 
} 

Ich wollte auch erwähnen, dass es Eigenschaft deserialisiert ist. Mit anderen Worten: Warenkorb wird beim Laden des Elements erneut zugewiesen.

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

Sie wollen wahrscheinlich, dies lesen einen Griff zu bekommen, wie RavenDB in diesen Szenarien funktioniert: http://ravendb.net/docs/theory/document-structure-design

In diesem Fall Artikel & Karte würde tatsächlich in das gleiche Dokument serialisiert werden, was nicht wahrscheinlich ist, was Sie wollen. Referenzen in RavenDB sollte nur die ID des Referenzdokuments, nicht das Dokument selbst enthalten.