2016-07-18 24 views
4

Ich habe Probleme beim Versuch, ein Objekt mit einer dynamischen Eigenschaft in RavenDB zu speichernWie speichern Sie C# -Objekte mit dynamischen Eigenschaften in RavenDB?

Das Objekt, das ich versuche zu speichern, ist eine Bestellung. Der Auftrag enthält eine Liste von Auftragszeilen so die folgende Order-Klasse vorstellen:

public class Order { 
    public int Id { get; set; } 
    public List<Orderline> Orderlines { get; set; } 
} 

Und die Orderline Klasse Wesen:

public class Orderline { 
    public Product Product { get; set; } 
    public int Quantity { get; set; } 
    public dynamic Attributes { get; set; } 
} 

Das Objekt Ich versuche zu retten (ich es mit JSON angezeigt werden);

{ 
    "Id": 0, 
    "Orderlines": [ 
     { 
      "Product": { 
       "Id": 0, 
       "Name": "Some product" 
      }, 
      "Quantity": 1, 
      "Attributes": { 
       "color": "Red" 
      } 
     } 
    ] 
} 

Speichern es keine Fehler werfen
RavenDB speichert das Order-Objekt als

{ 
    "Id": 0, 
    "Orderlines": [ 
     { 
      "Product": { 
       "Id": 0, 
       "Name": "Some product" 
      }, 
      "Quantity": 1, 
      "Attributes": { 
       "$type": "Newtonsoft.Json.Linq.JObject, Newtonsoft.Json", 
       "color": { 
        "$type": "Newtonsoft.Json.Linq.JValue, Newtonsoft.Json", 
        "$values": [] 
       } 
      } 
     } 
    ] 
} 

Beachten Sie, dass die Werte Eigenschaft Order.Orderlines[0].Attributes.color nicht gesetzt ...

Wenn ich versuche, Serialisierung des Objekts zurück zu meinem C# Order-Objekt Ich erhalte die folgende Ausnahme;

Kann Objekt des Typs gegossen 'Raven.Imports.Newtonsoft.Json.Utilities.CollectionWrapper`1 [Newtonsoft.Json.Linq.JToken]' eingeben 'Newtonsoft.Json.Linq.JValue'.

Was mache ich falsch, wie kann ich dieses Objekt in der RavenDB-Datenbank speichern und abrufen?

+0

http://StackOverflow.com/Questions/24208510/ravendb-dynamic-Objects kann relevant sein – stuartd

+0

Warum brauchen Sie die Dynamik? Ist die Lösung, verwenden Sie keine Dynamik – Liam

+0

@ Liam Die Sache ist, ich versuche, ein generisches Orderline-Objekt zu haben, das noch benutzerdefinierte Eigenschaften enthalten kann. Dies ist relevant, da ich in Zukunft gerne mehrere Produkte verwenden möchte, die dieselbe API verwenden, die die anwendungsspezifischen benutzerdefinierten Attribute in der Eigenschaft Attributes (in diesem Fall Farbe) speichern kann. – Bryandh

Antwort

2

Das Speichern der dynamischen Eigenschaft mit dem Typ 'dynamisch' war offensichtlich nicht genug. Wenn ich der Eigenschaft Attributes den ExpandoObject-Typ gab, speicherte RavenDB die Attributes-Eigenschaft als normales JSON (ohne $ type und $ values, also sauber wie gewünscht)

Beim Zurückholen aus der RavenDB-Datenbank wird das Deserialisieren in ein ExpandoObject-Objekt rückgängig gemacht .

Stellen Sie sicher, dass die ExpandoObject-Eigenschaft in eine dynamische (z. B. 'as dynamic') umgewandelt wird, wenn Sie versuchen, die Eigenschaft in einer Razor-Ansicht anzuzeigen.

2

Was ist der Typ, den Sie tatsächlich in Attributen speichern? Normalerweise verwenden Sie etwas, das tatsächlich dynamisch ist, wie ExpandoObject