1

私はずっと調べてきましたが、NHibernate に関するこの問題に対する良い答えを見つけることができません。

NHibernate を使用する API を使用しています。私はデータ転送を行っており、ユーザー オブジェクトを使用してユーザー データを保存しようとしています。

オブジェクトを作成します

User objUser = new User();

ID を ID に設定するように指定するマッピング ファイルがあります。

<id name="Id" column="UserId" type="int">
  <generator class="native" />
</id>

しかし、私の要件の 1 つは、古い ID をユーザー テーブルに保存することです。ID 挿入を一時的にオンに設定してレコードを保存できるようにする必要がありますが、ユーザー オブジェクトを使用して関連データを保存できるようにする必要があります。

私はこのようなことをしてみました

 using (ISession session = MyDatabaseFactory.SessionFactory.OpenSession())
{
    using (ITransaction trans = session.BeginTransaction())
    {
       session.CreateSQLQuery("SET IDENTITY_INSERT Users  ON").UniqueResult();
       session.Save(objUser, objUser.Id);
       session.Flush();

       trans.Commit();

       session.CreateSQLQuery("SET IDENTITY_INSERT Users OFF").UniqueResult();

       session.Close();
       objUser= session1.Merge(objUser);
       }
 }

しかし、後でこのようにユーザーオブジェクトを再度保存しようとすると

objUser.Passwords.Add("password1");
                    objUser.Save()

エラーが表示されます: 同じ識別子の値を持つ別のオブジェクトが既にセッションに関連付けられていました

4

2 に答える 2

0

Save()データベースに新しいオブジェクトを挿入しようとします。Update()永続オブジェクトのデータベース内の既存のレコードを更新するを試してください。SaveOrUpdate()上記のどれを使用するかを決定する which を使用することもできます。

再度呼び出すことSave()で、同じ ID を持つ別のレコードを挿入しようとしていると思います。 こちらの回答に詳細があります。

于 2013-04-22T08:54:05.637 に答える