2015-09-09 12 views
5

Ho una struttura di oggetto modulo personalizzata che utilizzo correttamente con mongodb.È possibile utilizzare il polimorfismo/ereditarietà nel driver C# DocumentDb

Ho studiato la possibilità di sostituire Mongo con DocumentDb.

La struttura My Class è costituita da un controllo di base ereditato da diversi tipi di controllo. per esempio. Controllo casella di testo, Dropdown Control

In mongo utilizzo il campo discriminatore per memorizzare il tipo effettivo, nel driver C# DocumentDb non riesco a trovare la stessa funzione.

di seguito è un esempio di come mongo memorizza la mia struttura di classe.

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

Nel documentdb la struttura si presenta come

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

Come si può vedere la versione mongo ha una proprietà "_t" indicando il tipo effettivo, questo viene poi utilizzato quando ho letto i dati per creare il tipo corretto Nella versione documentdb è semplicemente un fieldtype

+0

supporto adeguata per JsonSerializerSettings è finalmente in lavorazione da MS: https://github.com/Azure/azure-documentdb-dotnet/issues/229 – AndyJ

risposta

3

Dopo molte settimane di ricerche ho finalmente venuto attraverso la risposta

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

Fondamentalmente questa biblioteca si estende C# SDK del DocumentDb e consente impostazioni JSON personalizzato da applicare. Sotto il cofano gli utenti del driver documentdb json.net.

Ora ottengo la proprietà "$ type" che è una funzionalità integrata nell'eccellente libreria json.net di newtonsoft.

mio JSON ora sembra

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

Mi chiedo se è effettivamente necessario farlo in DocumentDb.

È possibile assegnare il tipo in quanto tale:

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

la mia sintassi potrebbe essere fuori ma la parte CreateDocumentQuery<T> dovrebbe fare ciò che è necessario, senza bisogno di memorizzare il tipo.

+0

L'avrebbe forse lavoro per alcuni scenari. Ma il mio setup specifico non conosco il tipo, quindi il tipo è memorizzato in JSON. –

Problemi correlati