3

1つのオブジェクトをデータベースに2回保存したいと思います。私はこのコードを持っています:

using (var ss = NHibHelp.OpenSession())
using (var tt = ss.BeginTransaction())
{
    var entity = new Entity();

    ss.Save(entity);
    ss.Save(entity);

    tt.Commit();
}

ただし、これにより、データベースに追加される行は1つだけになります。1つのオブジェクトをデータベースに2回(2つの異なるIDを使用して)挿入するにはどうすればよいですか?

4

2 に答える 2

7

これを行うべきではありません-NHibernateはセッション内で「オブジェクトID」を維持するため、同じオブジェクトを区別しません。私はこれに反対することを強くお勧めします。より良い解決策は、オブジェクトのクローンを作成する方法(リフレクションまたはCloneメソッドのいずれかを使用)を調べてから、クローンされたオブジェクトを保存することです。

上記の私のアドバイスを無視したい場合は、セッションからエンティティを削除し、IDを未保存の値(マッピングによって異なりますが、おそらく0)に戻し、再度保存することで、エンティティを機能させることができます。

session.Merge(entity)を2回呼び出した場合にも機能する可能性があります(最初の呼び出し後にIDを保存されていない値にリセットする必要があります)。

または、session.Merge()でステートレスセッションを使用することもできます。そうすれば、保存の間にエンティティを削除する必要はありません。

于 2012-06-13T10:55:04.260 に答える
3

あなたは2つの方法でそれを行うことができます:

  1. エンティティのクローンを作成します。ディープコピーである必要があります。

    using (var ss = NHibHelp.OpenSession())
    using (var tt = ss.BeginTransaction())
    {
      var entity = new Entity();
      var clonedEntity = entity.Clone();
      ss.Save(entity);
      ss.Save(clonedEntity);
    
      tt.Commit();
    }
    

IDが割り当てられている場合は、忘れずに新しいIDを作成してください。ディープコピーには複雑なエンティティに関するいくつかの問題があります。コレクションを反転した場合は、それらを再参照する必要があります。

2.新しいセッションで2番目のトランザクションを開き、コミットします。

var entity = new Entity();
using (var ss = NHibHelp.OpenSession())
using (var tt = ss.BeginTransaction())
{      
     ss.Save(entity);

     tt.Commit();
}

using (var ss = NHibHelp.OpenSession())
using (var tt = ss.BeginTransaction())
{      
     ss.Save(entity);

     tt.Commit();
}
于 2012-06-13T10:56:23.817 に答える