2015-02-19 4 views
5

Ich hoffe, dass jemand helfen kann. Ich beschäftige mich mit dem C# -Treiber für MongoDB und der Handhabung der Serialisierung. Betrachten Sie die folgenden Beispielklassen:Wie erhalten Sie einen Verweis auf das übergeordnete Objekt in einem deserialisierten MongoDB-Dokument?

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

Beachten Sie, dass SubThing über eine Eigenschaft verfügt, die auf seine Eltern verweist. Also beim Erstellen von Objekten ich so wie folgt aus:

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

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

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

Die ParentThing Eigenschaft wird auf BsonIgnore gesetzt, weil sonst wäre es eine kreisförmige Referenz verursachen, wenn sie auf MongoDB Serialisierung.

Wenn ich MongoDB serialisieren es das Dokument erstellt genau, wie ich es erwarten sein:

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

Hier ist das Problem: Wenn ich deserialisieren ich locker SubThing Verweis auf seine Eltern. Gibt es eine Möglichkeit, Deserialisierung so zu konfigurieren, dass die ParentThing-Eigenschaft immer sein übergeordnetes Dokument ist?

Antwort

5

von mongodb Website

Implementierung ISupportInitialize - Der Fahrer achtet eine Einheit ISupportInitialize Implementierung, die zwei Methoden enthält, Begin und EndInit. Diese Methode wird aufgerufen, bevor die Deserialisierung beginnt und nachdem sie abgeschlossen ist. Es ist nützlich für die Ausführung von Operationen vor oder nach der Deserialisierung, z. B. wenn Schemaänderungen verarbeitet werden, um einige teure Operationen vorab zu berechnen.

so, ThingISupportInitialize implementieren wird und die Funktion BeginInit bleibt leer und Endinit wird St.ParentThing = this;

+0

verdammt. 19 Sekunden !! :-) +1 von mir – mnemosyn

+0

Vielen Dank. :-) – Pseudo

1

Auf dieser Ebene der Abstraktion enthält, ist es schwer, eine eindeutige Antwort zu geben.

Ein Weg ist die Klasse implement ISupportInitialize, die nach De-Serialisierung einen Haken bietet. Das ist wahrscheinlich die einfachste Lösung für das vorliegende Problem. Ansonsten zeigt derselbe Link auch, wie ein benutzerdefinierter Serializer geschrieben wird, aber das sollte in diesem Fall nicht erforderlich sein.

Verwandte Themen