Wie kopiere ich ein Objekt mit NHibernate

8

Ich benutze Nhibernate (ich bin ein komplettes noob), und was ich in der Lage sein möchte, ist eine Entität zu kopieren, die aus der Datenbank geladen wird und sie mit einer neuen ID speichert ... hat jemand in diese Situation geraten ? Jede Hilfe wäre sehr willkommen.

    
PCG 29.10.2010, 22:23
quelle

2 Antworten

5

Ich muss genau das für eine sehr komplexe Menge von Objekten tun und was ich bisher gefunden habe ist:

NHibernate unterstützt dies nicht genau.

Wenn Sie versuchen, die ID eines Objekts, das Sie aus einer Sitzung erhalten haben, einfach zu ersetzen, erhalten Sie einen Nhibernate-Fehler: Der Bezeichner einer Instanz von wurde von & lt; 9ae3868d-17bf-4314-ba0c-4eb3b44b1a2e & gt; zu & lt; 2b2b67c6-a421-48c4-836c-4c27f6481718 & gt;

Wenn die Sitzung nicht mehr über die Objekte informiert ist, die sie abgerufen hat, d. h. wenn Sie sie vor dem Speichern und Leeren verwerfen, funktioniert jetzt nur das Ändern der IDs. So könnten Sie Code wie folgt schreiben:

%Vor%

Das Problem dabei ist, dass, wenn Ihr Objektgraph eine Tiefe hat, Sie sicher sein müssen, das gesamte Set zu entfernen, und Sie dann möglicherweise die Originale in der Sitzung benötigen, müssen Sie sie noch einmal abrufen. Dies ist ein logistischer Kopfschmerz und führt zu Code mit sehr obskuren und verschlungenen Absichten.

Ich empfehle nicht.

Was häufiger gemacht wird, ist das Serialisieren in einen binären Stream und das Rekonstruieren dieses Stroms in eine neue Menge von Objekten. Fein, funktioniert aber nur, wenn Ihre Objekte alle serialisierbar sind.

Das ist nicht der Fall für mich, was ich mache ist, dass ich manuellen Code geschrieben habe, um tiefe Kopien eines Objektgraphen mit Hilfe von Kopierkonstruktoren zu erstellen. Dies ist komplex und kann auch zu Wartungsproblemen führen. Wenn die Objekte jedoch nicht serialisiert werden können, gibt es nur wenige bessere Alternativen.

Sorry, das tiefe Kopieren von Objekten bleibt eine komplizierte Aufgabe, wenn die Serialisierung keine Option ist.

    
Sisyphus 30.10.2010, 00:21
quelle
9

Mach einfach new MyClass() und kopiere alles außer der ID. Sie können dafür eine Reflexion verwenden.

    
Diego Mijelshon 30.10.2010 02:12
quelle