2015-02-19 10 views
5

Mam nadzieję, że ktoś może pomóc. Zajmuję się sterownikiem C# dla MongoDB i tym, jak radzi sobie z serializacją. Rozważmy następujący przykład klas:Jak uzyskać odniesienie do obiektu nadrzędnego w zserializowanym dokumencie MongoDB?

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(); 
    } 
} 

Należy zauważyć, że SubThing ma właściwość, która odwołuje się do rodzica. Więc podczas tworzenia obiektów zrobić tak jak poniżej:

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

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

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

Obiekt ParentThing jest ustawiony na BsonIgnore bo inaczej byłoby to spowodować odwołanie cykliczne podczas SZEREGOWANIE do MongoDB.

Kiedy ja serializacji do MongoDB tworzy dokument dokładnie jak ja oczekiwać, że będzie:

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

Oto problem: Kiedy deserializowania stracę odniesienie SubThing do jego rodzica. Czy istnieje sposób konfigurowania deserializacji, tak aby właściwość ParentThing była zawsze jej nadrzędnym dokumentem?

Odpowiedz

5

z MongoDB stronie

wykonawcze ISupportInitialize - sterownik zgodny jednostkę wykonawczą ISupportInitialize zawierającym 2 metodami, BeginInit i EndInit. Te metody są wywoływane przed rozpoczęciem deserializacji i po jej zakończeniu. Jest to przydatne do uruchamiania operacji przed lub po deserializacji, takich jak obsługa zmian schematu jest wstępnym obliczeniem niektórych kosztownych operacji.

tak, Thing wdroży ISupportInitialize a funkcja BeginInit pozostanie pusty i Endinit będzie zawierać St.ParentThing = this;

+0

darn. 19 sekund !! :-) +1 ode mnie – mnemosyn

+0

Wielkie dzięki. :-) – Pseudo

1

Na tym poziomie abstrakcji, że trudno dać jednoznacznej odpowiedzi.

Jednym ze sposobów jest uzyskanie klasy implement ISupportInitialize, która oferuje hak po serializacji. Jest to prawdopodobnie najłatwiejsze rozwiązanie danego problemu. W przeciwnym razie ten sam link pokazuje również, jak napisać niestandardowy serializer, ale nie powinno to być wymagane w tym przypadku.

Powiązane problemy