2009-03-19 5 views
2

変更を取り消して以前のバージョンにロールバックできるように、「以前のバージョン」を作成します。オブジェクトグラフが重複し、nhibernateで新しいものとして維持されます

私はさまざまなプロパティと管理スタッフのコレクションを持つマネージャオブジェクトを持っています。これは、データベース内の2つのテーブルに関連し、スタッフは外部キーによってマネージャにリンクされています。

私がしたいのは、マネージャーとそのスタッフ全員を複製して、マネージャーテーブルの新しいエントリーとして、そしてスタッフテーブルの新しいエントリーとしてデータベースに保存することですマネージャー。

私はnhibernateを使用しており、これで賢明なやり方があるのか​​疑問に思っています。私はこれを行うと考えることができ

唯一の方法は手動です:

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

上記の例では、私はそれを行うだろうか、正確にはありませんが、私は願ってアイデアを得ます。

私は反射を使用して手動で設定する代わりに小道具を取得することを考えましたが、それは私が持っているほど巧妙です。

nhibernateでオブジェクトグラフをコピーして新しいエントリとして保持する方法はありますか?

誰か明るいアイデアを持っていますか?

+0

私はそれが単なるコード例だと知っていますが、あなたの 'manager'と' staff'クラス名は本当に小文字ではないことを願っています! – kroimon

答えて

0

エンティティをシリアライズ可能としてマークすると、バイナリシリアル化が可能です。

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

    } 

基本的にあなたは、これはあなたのグラフのディープコピーを与えるデシリアライズ方法その後、シリアル化を呼び出すと、あなたはあなたが持つかもしれない任意のIDを更新する必要があると思います。

これは、nHibernatesの遅延読み込み機能とどのように関係しているのでしょうか。私はこれを多くしましたが、nHibernateから引き出すオブジェクトではありません。また、あなたのオブジェクトにSerializableを置くことを忘れないでください。

+0

エラーが発生しました System.Runtime.Serialization.SerializationException: 'NHibernate、Version = 1.2.1.4000、Culture = neutral、PublicKeyToken = aa95f207798dfdb4'のアセンブリで 'NHibernate.Cfg.Configuration'がシリアル化可能とマークされていません。 これもシリアル化可能とマークできませんか? –

+0

いいえ、あなたのオブジェクトには参照がなく、セッションやSessionFactoryには参照がありません。 – JoshBerke

+0

いくつかの静的メソッドがあります。私は例えばmanager.create(newManager)を持っています。 私はrepoパターンを使用して、自分のエンティティでref nhibernateを停止する必要があると私は言うだろうと思いますか? –

関連する問題