2017-08-01 4 views
1

いくつかのレガシーコードでバグを修正しようとしています。コードはデータベースからオブジェクト(行)を削除しようとしています。ただし、Sessionにはオブジェクトが含まれていない場合があり、例外がスローされます。セッションにオブジェクトが含まれているかどうかを確認するためのテストを追加してから、セッションにオブジェクトを取得するためにさまざまなことを試してみましたが、それまでは成功していません。他に何を試すことができますか?オブジェクトをセッションにアタッチする

このコードは、ユニットワークの倫理に従わないという点で、nHibernate Sessionを実装していません。アプリケーションは、開始時に1つのセッションを作成し、アプリケーションの存続期間を通してそのセッションを使用します。私はこれについて何もすることができません(完全な書き換え以外は、とにかくnHibernateを放棄します)。

using (ITransaction transaction = this.Session.BeginTransaction()) 
{ 
    try 
    { 
     if (Session.Contains(object)) 
     { 
      Session.Delete(object); 
      transaction.Commit(); 
     } 
     else // new code, Session does not contain object 
     { 
      try 
      { 
       //Session.Close(); 
       //Session.Dispose(); 
       //Session.Disconnect(); 
       Session.Merge(object); 
       Session.Save(object); // this does something 
       Session.Lock(object, LockMode.Upgrade); // .Write in invalid mode 
       Session.Update(object); 
       using (ITransaction transaction2 = this.Session.BeginTransaction()) 
       { 
        // this code executes with no error but does not delete the row from the database 
        Session.Delete(object); 
        transaction2.Commit(); 
       } 
      } 
      catch (System.Exception exception) 
      { 
       string message2 = exception.ToString(); 
       MessageBox.Show(message2, "Delete() Try it again ", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 
} 
    catch (System.Exception exception) 
    { 
     if (transaction != null) 
     { 
      transaction.Rollback(); 
     } 
     throw exception; 
    } 
} 
+1

あなたは別の方法で削除しようとすることができます:https://stackoverflow.com/a/25762358/1162077の提案のための –

+0

感謝。これは改善のようです。行を削除し、例外もスローします。あなたが私のコードで独特の何かを感じることはできません。 –

答えて

0

最初にセッションからオブジェクトを取得しないのはなぜですか?

using (ITransaction transaction = Session.BeginTransaction()) 
{ 
    var persisted = Session.Get<SomeType>(object.Id); //object will be loaded if not already in the session 
    Session.Delete(persisted); 
    transaction.Commit(); 
} 
+0

エンティティデータを取得するために 'Get'がデータベースまたはセッションキャッシュをヒットします。エンティティが存在する場合、それが返されます。さもなければ、 'null'が返されます。 –

関連する問題