2 Stimmen

Objektgrafik duplizieren und als neues Objekt in nhibernate zurückhalten

Ich möchte "frühere Versionen" erstellen, damit ein Benutzer die vorgenommenen Änderungen rückgängig machen und zu einer früheren Version zurückkehren kann.

Ich habe ein Manager-Objekt mit verschiedenen Eigenschaften und eine Sammlung von verwalteten Mitarbeitern. Dies bezieht sich auf zwei Tabellen in der Datenbank mit Mitarbeitern, die mit dem Manager durch einen Fremdschlüssel verbunden sind.

Was ich tun möchte, ist der Manager und alle seine Mitarbeiter zu duplizieren und speichern Sie es zurück in die Datenbank als einen neuen Eintrag in der Manager-Tabelle und eine Reihe von neuen Einträgen in der Mitarbeiter-Tabelle, die unsere im Zusammenhang mit dem neuen Manager.

Ich verwende nhibernate und habe mich gefragt, ob es einen cleveren Weg gibt, dies mit diesem Programm zu tun.

Die einzige Möglichkeit, die mir dazu einfällt, ist die manuelle Eingabe:

manager old = getManager(); // get the original for copying 

manager newManager = new manager(); // create a blank object
newManager .name = old.name //give the new manager the old one's props;

//cycle through the staff duplicate and add to new managers staff collection
foreach(staff s in old.staffCollection)
{
  staff newStaff = new staff();
  newstaff.name = s.name;
  newManager.staffCollection.Add(newstaff); 
}

das obige Beispiel ist nicht genau so, wie ich es machen würde, aber ich hoffe, Sie verstehen die Idee.

Ich habe darüber nachgedacht, Reflexion zu verwenden, um die Requisiten zu erhalten, anstatt sie manuell zu setzen, aber das ist ungefähr so clever, wie ich es habe.

Gibt es in nhibernate eine Möglichkeit, den Objektgraphen zu kopieren und ihn als neue Einträge wiederherzustellen?

oder hat jemand eine gute Idee?

0voto

JoshBerke Punkte 64214

Wenn Sie Ihre Entities als serialisierbar markieren, können Sie eine binäre Serialisierung durchführen.

   public static MemoryStream Serialize(object data)
    {

        MemoryStream streamMemory = new MemoryStream();
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.AssemblyFormat = FormatterAssemblyStyle.Simple;

        formatter.Serialize(streamMemory, data);

        return streamMemory;
    }
    public static Object Deserialize(MemoryStream stream)
    {

        BinaryFormatter formatter = new BinaryFormatter();
        formatter.AssemblyFormat = FormatterAssemblyStyle.Simple;
        return formatter.Deserialize(stream);

    }

Im Wesentlichen würden Sie die Serialize dann die DeSerialize-Methode aufrufen, die Ihnen eine tiefe Kopie Ihres Graphen geben wird, dann müssten Sie alle IDs aktualisieren, die Sie haben könnten.

Wort der Vorsicht, ich bin nicht sicher, wie dies mit nHibernates Lazy Loading-Funktionalität spielen wird. Ich habe das schon oft gemacht, aber nicht mit Objekten, die ich aus nHibernate ziehe. Vergessen Sie auch nicht, Serializable auf Ihre Objekte zu setzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X