2011-10-19 6 views
1

http://nhibernate.info/doc/nh/en/index.html#manipulatingdata-exceptionsによると、データベース例外の後、セッションは破棄されるべきです。CurrentContextなしでデータベース例外の後でNHibernateセッションを再開

私たちのWebアプリケーションでは、場合によっては、ADOExceptionsをスローしてキャッチするのが普通です。例えば、制約違反の場合。

リンク先のドキュメントによれば、セッションを中止する必要があります。ただし、制約違反が発生した場合は、データベースを使用して作業を行いたいので、新しいセッションが必要です。我々のテストで

我々は

CurrentSessionContext.Unbind(SessionFactory).Close(); 
CurrentSessionContext.Bind(SessionFactory.OpenSession()); 

を呼び出すことにより、これを行うが、我々はCurrentSessionContextを使用していないウェブアプリでは、我々はLazySessionContextを使用しています。 WebビジネスクラスではCurrentSessionContextを直接参照できません.HttpContextは統合テスト中に利用できないため、Webからは使用されず、LazySessionContextを参照できません。

セッションを廃棄して再作成し、現在のコンテキストに接続する方法はありますか?は直接コンテキストクラスを参照していませんか?私はSessionFactoryオブジェクトとSessionオブジェクトを持っています。

+0

NHibernateリファレンスの更新リンク:http://nhibernate.info/doc/nh/en/index.html#manipulatingdata-exceptions –

答えて

0

クリティカルにならないように、アプリケーションのデザインを再考する必要があります。ユーザーは、制約違反などのADOExceptionを引き起こす可能性のあるデータを入力できないように、インスタンスまたは検証用のコンボボックスを使用してインターフェイスを実装する必要があります。これらが発生した場合、内部エラーとしてユーザーに報告し、ASP.NETに組み込まれた正常性監視などの別のメカニズムを使用してそのエラーを記録することができる例外的な状況です。

NHibernateを使用しているときに、通常は制約違反が心配する必要がないので、あなたのエンティティが別の見た目を必要とするかもしれないと付け加えます。

+0

マルチユーザアプリケーションではそれほど簡単ではありません。ユーザーAがユーザーBがEntityBを削除した後、わずか1秒でEntityBへの参照を含む新しいEntityAを保存しようとするとどうなりますか? – cremor

+0

@cremorユースケースに応じて最適化ロックまたは悲観的ロックを実装します。 – s1mm0t

+0

オプティミスティックロックの失敗も例外です。また、EntityAの編集UIまたは作成UIを持つユーザーがいる限り、EntityAから参照できるすべてのテーブルをロックすることは現実的ではありません。 – cremor

関連する問題