2012-04-05 7 views
0

NHibernateに問題がありますISession。私がデータベースに間違ったものを残そうとすると(例えば、XYZ colに重複キーを持つエンティティを保存する)、ロールバックすると、Transactionが返されます。 ISessionインスタンスはBROKEN/INVALID状態になり、その後はレコードが残らず、NHibernatは初めての問題について私に知らせる別の例外をスローします。NHibernateのセッション:例外の後に永続化することはできません

私はFlush, Clear, CloseのようなISessionメソッドを使用しましたが、私の問題が存在します。もう1つの方法は、別のISessionインスタンスをISessionFactoryにリクエストすることですが、私がこれを使用すると、別の奇妙な問題が発生します:illegal attempt to associate a collection with two open sessions

から別のセッションを再要求せずにISessionインスタンスを復元するにはどうすればよいですか?事前に

感謝:)

+0

このモデルにはlazyloadプロパティがありますか? –

+0

はい!多くの遅延読み込みプロパティ(ナビゲーション、コレクション) – Sadegh

+0

プロパティの一部を要求している場合は問題があります。 –

答えて

1

あなたはISessionを回復することはできません。 documentationから:ISessionはあなたがすぐに トランザクションロールバックしなければならない例外をスローする場合

、ISession.Close()を呼び出してISession インスタンスを破棄。セッションの特定のメソッドは、セッションを の一貫した状態にしません。

creating ISession is cheapだから、再利用しようとする理由はありません。 MVCアプリケーションを使用している場合は、リクエストごとにSessionを使用することをお勧めします。

1

あなたはできない、とあなたはいけません。

トランザクションが失敗した場合は、要求を中止してエラーを表示する必要があります。

論理的な結論は、セッションの例外は通常のフローの一部であってはならないということです。あなたはMVCを使用しているので、

は今、ここにあなたがエラーを許可した場合にエラー処理がうまくいくかもしれない方法の例です:

public ActionResult CreateFoo(FooModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     try 
     { 
      SaveThe(model); 
      TheTransaction.Commit(); 
      return RedirectToAction("Whatever"); 
     } 
     catch (WhateverTheDuplicateKeyExceptionIs) 
     { 
      ModelState.AddModelError("", "Duplicate XYZ"); 
     } 
    } 
    return View(); 
} 
関連する問題