2009-08-17 9 views
0

私はORMとしてNHibernateを使用しています。私はITトランザクションに包まれたものがある状況があります。 NHibernateのSaveUpdateイベントを聞いて、そのSaveUpdateハンドラでエンティティの検証を行っています。NHibernate - 検証とトランザクションの問題

私のエンティティの1つでは、特定のプロパティの値が変更されていないことを検証したいと思います。だから、私は、データベースから既存のオブジェクトの値を読み込み、新しい値と比較すると考えました。問題は、エンティティオブジェクトを保存するためにITransaction.Commit()を呼び出し、トランザクションがロックされているため、トランザクションが検証が行われた時点で実際にコミットされていないため、データベースから既存のオブジェクトを読み込むことができないということです。

ここで私はいくつか異なる質問があると思います: - SaveUpdateイベントは検証を行う正​​しい場所ですか? - これを実行する別の方法がありますか(データベースから既存の値を取得して比較する)必要な検証を行うことができますか?

他の誰かが似たような状況に遭ったと確信しています......うまくいけば!

答えて

0

検証の方法の例を見たい場合は、ScottGuのNerdDinnerをチェックすることをお勧めします。彼はORMのためにLinqをSQLに使用していますが、NHibernateにそれを適用するのは非常に簡単です。

私は最近、ASP.NET MVC + NHibernateプロジェクトでNerdDinnerのような検証システムを使用して大成功を収めました。

0

検証は永続性とは関係がないため、saveupdateは適切な場所ではありません。検証の正しい場所は、検証する内容、プログラミングスタイル、検証メッセージを表示するために使用するUIフレームワークなどによって決まります。個人的には、変更が行われる場所に検証を置くことを好みます。プロパティを設定するchangeメソッドに配置します。私はなぜ前の状態でエンティティを読み込みたいのか理解できません。なぜなら、その状態が初めて読み込まれるときに読み込まれているからです。

+0

私は同意しません。私は最終的に保存前にエンティティを検証したいので、永続性と関係があると思います。プロパティの検証は単純なケースでも有効ですが、検証ルールには単一のエンティティだけでなく、銀行口座に1人の主なアカウント所有者しか持てない場合もあります。 –

+0

あなたのエンティティ内のものを変更するメソッドを使用しない理由ではありません。集約ルートは、子エンティティの検証を担当する必要があります。 – Paco

+0

しかし、集約ルートの子エンティティを保存するとどうなりますか? –