4

ビジネスロジックの検証を担当するサービスオブジェクトがあります。Update to repositoryを発行する前に、それが機能するエンティティがいくつかのビジネスルールに準拠しているかどうかをチェックします。

チェックする必要があるルールの1つは、データベースにあるエンティティと比較したときに、エンティティのStatusプロパティが変更されていないかどうかです。同じISessionを共有するリポジトリを使用しているため、データベースからエンティティを取得しようとすると、比較用のオブジェクトを取得します。

if (fromDbEntity.Status != entity.Status) throw new Exception("Cannot change status...");

私は常に第1レベルのキャッシュにあるfromDbEntityを取得するので、同じオブジェクトで作業します。

NHibernate / Repositoryがすでにセッションのスコープ内にある場合でも、データベースからエンティティを取得するように強制する方法はありますか?

4

4 に答える 4

7

entityロードする前にセッションから退出するfromDbEntity

session.Evict(entity);

詳細については、公式ドキュメントを確認してください。キャッシュの管理

これに関する欠点は、オブジェクトがセッションから外れているSaveOrUpdateため、手動で呼び出す必要があることです。entity

于 2012-06-13T14:03:03.900 に答える
3

クラウディオが示唆しているように、entityセッションからを削除し、をロードfromDbEntityして比較を行い、エンティティをセッションと再度マージすることができます。

あなたがするかもしれない他のことは、代わりにステートレスセッションfromDbEntityを使用してロードすることです。

しかし、これは本当に必要ですか?Statusプロパティを読み取り専用にすることはできませんか?NHibernateは、データにアクセスするためのフィールドを完全に使用できます。または、プロパティセッターを作成することもできますprotected

public virtual Status Status { get; protected set; }

このように、ユーザーはプロパティ値を変更できないため、現在の値がデータベースの値と異なるかどうかを確認する必要はありません。

于 2012-06-13T14:21:40.330 に答える
1

同様の問題がありました。データベースに到達したい呼び出しの前にセッションをクリアすることで問題を解決しました。

session.Clear();

少しやり過ぎですが、機能します。

于 2012-06-14T07:29:59.230 に答える
0

あなたがあなたの論理を満足させる方法、それは潜在的なバグがあるように聞こえます。より良い解決策は、動的更新をオンにして、変更された値のみを更新し、保存する前に誰もステータスを変更していないことを検証することです。

于 2012-06-14T15:12:12.970 に答える