2009-04-09 27 views
3

フィールドが変更されたかどうかを判断する必要があるコールがあります。しかし、そのエンティティidを使用してgetを呼び出すと、以前のバージョンと同じエンティティが返されます。NHibernateでエンティティフィールドが変更されたかどうかを確認します

Entity e = Dao.Get(id); 
//At this point e.Field is X 
e.Field = y; 
Dao.Save(e); 

Entity Dao.Get(Guid id) 
{ 
    return Session.Get(id); 
} 

Entity Dao.Save(Entity e) 
{ 
    Entity olde = Session.Get(e.Id); 
    if (e.Field != olde.Field) <--- e.Field == olde.Field so it does not run. 
    DoBigMethod(e); 
    return e; 
} 

エンティティクラスにonChangeメソッドを追加しないでこのような状況を処理するにはどうすればよいですか。

答えて

1

エンティティの1つの「バージョン」、つまり現在のバージョンのみがわかります。 は実際にはです。エンティティの1つのバージョンのみです。あなたはそれを記憶しており、すでにそれを変更して以前の状態を忘れてしまった。

前のデータベースの状態を表示するには、呼び出しは危険です。変更が既にフラッシュされている場合(NHibernateがクエリの前にフラッシュするなど)、変更が得られます。別のセッションを開くと、他のトランザクションからの変更が表示されます。

1つのフィールドだけに興味がありますか?その後、古い値をどこかにキャッシュすることができます。

これが機能しない場合は、このフィールドの以前の値を知る必要がある理由を教えてください。

EDIT:

いくつかのより多くのアイデア:

  • キャッシュ
  • はそれならばフラグを設定し、このプロパティを実装DAO.Getでオブジェクトを取得するフィールドの前の状態、かわった。
  • この変更を、フラグが変更されたときに呼び出される暗黙の操作ではなく、クライアントによって呼び出される明示的な操作にすることを検討してください。例えば、このフラグが "Activated"と呼ばれる場合、 "Activate"と "Deactivate"メソッドを実装します。このメソッドは、そのフラグを変更し、 "大規模なコードセット"を実行します。このフラグは、他の世界では読み取り専用です。
+0

ユーザーに変更が加えられた場合、大きなコードセットが実行されるというフラグがあります。このコードは、特定のケースで例外をスローします。他のフィールドを更新しているだけの場合は、このチェックを行う必要はありません。そのような場合は例外が起こりにくいでしょう。 – Thad

+0

私は私の答えにいくつかのアイデアを追加しました。それが役に立てば幸い。 –

関連する問題