2015-09-09 5 views
5

Ich habe eine benutzerdefinierte Formularobjektstruktur, die ich erfolgreich mit mongodb verwende.Kann ich Polymorphismus/Vererbung im C# -DocumentDb-Treiber verwenden

Ich habe die Möglichkeit untersucht, Mongo mit DocumentDb zu ersetzen.

Meine Klassenstruktur besteht aus einem Basissteuerelement, von dem verschiedene Steuerelementtypen abgeleitet werden. z.B. Textfeldsteuerung, Dropdown-Steuerelement

In Mongo verwende ich das Diskriminatorfeld, um den tatsächlichen Typ zu speichern, in dem C# -DocumentDb-Treiber kann ich nicht finden, die gleiche Funktion zu finden.

unten ist ein Beispiel dafür, wie Mongo meine Klassenstruktur speichert.

{ 
    "_t" : "TextboxControl", 
    "LabelText" : "Location of incident", 
    "IsRequired" : true, 
    "_id" : "cbe059d9-b6a9-4de2-b63b-14d44b022e37" 
} 

In documentdb die Struktur sieht wie

{ 
    "LabelText": "Location of incident", 
    "IsRequired": true, 
    "id": "cbe059d9-b6a9-4de2-b63b-14d44b022e37" 
} 

Wie Sie die Mongo Version eine „_t“ Eigenschaft hat sehen können, die tatsächliche Art und erklärt diese dann verwendet wird, wenn ich die Daten lesen die erstellen richtiger Typ. In der Documentdb-Version ist es einfach ein Feldtyp

+0

Die richtige Unterstützung für JsonSerializerSettings schließlich gearbeitet wird von MS auf: https://github.com/Azure/azure-documentdb-dotnet/issues/229 – AndyJ

Antwort

3

Nach vielen Wochen des Suchens kam ich schließlich über die Antwort

https://github.com/markrexwinkel/azure-docdb-linq-extension

Grundsätzlich ist diese Bibliothek des C# SDK DocumentDb erweitert und ermöglicht Einstellungen benutzerdefinierte JSON angewandt werden. Unter der Haube der Benutzer von documentdb json.net.

Ich bekomme jetzt die Eigenschaft "$ type", die eine Funktion in newtonsoft ausgezeichnete json.net-Bibliothek eingebaut ist.

Mein json sieht nun wie

{ 
    "$type" : "MyNameSpace.DropDownSingleFormBuilderControlTemplate, MyLibrary", 
    "LabelText" : "Label Text" 
    "IsRequired" : true, 
    "_id" : "cbe059d9-b6a9-4de2-b63b-14d44b022e37" 
} 
0

Ich frage mich, ob Sie dies überhaupt in DocumentDb tun müssen.

Sie können den Typ als solche zuzuordnen:

private TextBoxControl GetControl(string link) 
{ 
    return client.CreateDocumentQuery<TextBoxControl>(link, "SELECT TOP 1 * FROM Controls"); 
} 

Meine Syntax aus sein könnte, aber die CreateDocumentQuery<T> sollte Teil tun, was Sie brauchen, ohne den Typ speichern zu müssen.

+0

Das würde möglicherweise arbeite für einige Szenarien. Aber mein spezifisches Setup kenne ich nicht den Typ, daher ist der Typ im JSON gespeichert. –