2015-02-19 6 views
5

Spero che qualcuno possa aiutare. Sto prendendo confidenza con il driver C# per MongoDB e come gestisce la serializzazione. Considerare le seguenti classi di esempio:Come ottenere un riferimento all'oggetto padre in un documento MongoDB deserializzato?

class Thing 
{ 
    [BsonId] 
    public Guid Thing_ID { get; set; } 
    public string ThingName {get; set; } 
    public SubThing ST { get; set; } 

    public Thing() 
    { 
     Thing_ID = Guid.NewGuid(); 
    } 
} 

class SubThing 
{ 
    [BsonId] 
    public Guid SubThing_ID { get; set; } 
    public string SubThingName { get; set; } 
    [BsonIgnore] 
    public Thing ParentThing { get; set; } 

    public SubThing() 
    { 
     SubThing_ID = Guid.NewGuid(); 
    } 
} 

Si noti che SubThing ha una proprietà che fa riferimento al padre. Così, quando la creazione di oggetti lo faccio in questo modo:

 Thing T = new Thing(); 
     T.ThingName = "My thing"; 

     SubThing ST = new SubThing(); 
     ST.SubThingName = "My Subthing"; 

     T.ST = ST; 
     ST.ParentThing = T; 

La proprietà ParentThing è impostato su BsonIgnore perché altrimenti causerebbe un riferimento circolare quando serializzazione a MongoDB.

Quando non serializzare MongoDB si crea il documento esattamente come mi aspettavo che fosse:

{ 
"_id" : LUUID("9d78bc5c-2abd-cb47-9478-012f9234e083"), 
"ThingName" : "My thing", 
"ST" : { 
    "_id" : LUUID("656f17ce-c066-854d-82fd-0b7249c80ef0"), 
    "SubThingName" : "My Subthing" 
} 

qui è il problema: Quando ho deserializzare perdo il riferimento di SubThing al suo genitore. C'è un modo per configurare la deserializzazione in modo che la proprietà ParentThing sia sempre il suo documento principale?

risposta

5

dal sito web mongodb

esecuzione ISupportInitialize - Il driver rispetta un'entità esecuzione ISupportInitialize che contiene 2 metodi, BeginInit e EndInit. Questi metodi vengono chiamati prima che inizi la deserializzazione e dopo che è stata completata. È utile per eseguire operazioni prima o dopo la deserializzazione, ad esempio la gestione delle modifiche dello schema sta pre-calcolando alcune operazioni costose.

così, Thing implementerà ISupportInitialize e la funzione BeginInit rimarrà vuota e Endinit conterrà St.ParentThing = this;

+0

maledetto. 19 secondi !! :-) +1 da me – mnemosyn

+0

Mille grazie. :-) – Pseudo

1

A questo livello di astrazione, è difficile dare una risposta definitiva.

Un modo è quello di avere la classe implement ISupportInitialize che offre un hook dopo la deserializzazione. Questa è probabilmente la soluzione più semplice per il problema in questione. In caso contrario, lo stesso link mostra anche come scrivere un serializzatore personalizzato, ma non dovrebbe essere richiesto in questo caso.

Problemi correlati