0

私は、NHibernate のかなり一般的な使用例だと思うものを持っています。エンティティを作成し、ISession.Save() に続いて Transaction.Commit() を使用して保存しようとしました。この時点で、一意/主キー制約などの違反が例外として発生することを期待しています。ただし、私が見ているのは単なる GenericADOException です。これは、真の DB 障害と、一意性を維持するためにエンティティに別の名前を選択するようユーザーに求めるようなものとを区別するのに役立ちません。

現時点では、制約に違反しないようにするために、最初にクエリを実行するという醜い回避策を実装しました。これは発生を待っている単なる競合状態であり、ユーザーに「おっと、DB が何かおかしなことをしました。これをもう一度試してみてください」と表示されたくありません。メッセージの種類。

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

4

1 に答える 1

0

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

于 2009-03-10T23:02:03.610 に答える