2009-03-10 14 views
0

NHibernateのかなり一般的な使用例だと思います。私はエンティティを作成し、ISession.Save()とそれに続くTransaction.Commit()を使用してエンティティを保存しようとします。この時点では、ユニーク/プライマリキーの制約などの違反が例外として私に届くことを期待しています。しかし、私が見ているのは単なるGenericADOExceptionです。これは、固有のものを保持するためにエンティティの別の名前を選択するようユーザーに依頼するようなものに対して、本物のDBの失敗を区別するのに役立ちません。NHibernateのDBからの制約違反の扱い

現時点では、私は制約を守らないためにまずクエリを実行するという醜い回避策を実装しました。これは単なる競合状態であり、私は実際にユーザーに "Oopsを見せたくありません。DBは面白いことをしました!おそらくもう一度試してみてください。"メッセージの種類。

これを修正するにはエレガントな方法がありますか?

答えて

0

NHibernateは制約を認識していません(最初は一意の制約を強制するのが難しいでしょう)ので、これを処理することは主にあなた次第です。私は、値が存在しないことを確認するためのクエリを正しい軌道に乗っていると思いますが、これは最初に値を挿入する別のプロセス/スレッドの可能性を残しています。その方法の解決策は排他的なロックですが、もちろんそのロックの意味を考慮する必要があります。私はNHibernateのロック方法がどのように動作するのかわかりませんが、必要なものが提供されない場合は、いつでも接続にアクセスして未処理のSQLを使用できます。

関連する問題