6

NHibernate によって返される内容が DB の内容と一致しないという明らかなキャッシュの問題に遭遇しました。

これはレベル 2 のキャッシュ データだと思います。Evict を使用してこれを行うことができるように見えますが、実際に Evict メソッドを呼び出す必要があるのはいつですか? 私の特定のアプリケーションでは、データはユーザーに固有のものになり、提供されたデータは一度しか使用されない可能性があります*。

これらのオブジェクト セットのレベル 2 キャッシュを完全に無効にすることはできますか?

10/31更新

私のシナリオは次のとおりです。顧客がアイテムを追加および削除するショッピング カートがあります。私がやっていることは次のとおりです。カートへの更新が処理される前に、エンティティCartCartProductエンティティを削除します。これが完了したらCartProducts、プロバイダーからリストを取得し、ビューを返します (これは .NET MVC コントローラーで発生しています)。

11/3更新

その後、ショッピング カートは終了し、同じ NHibernate の問題に関連しているように見える問題に遭遇しましたが、実際には MVC の問題でした。さらに深く掘り下げると、HTML ヘルパー拡張機能が、私が想定していた値を上書きし、Model 状態のものに置き換えていることが明らかになりました。したがって、これには二重の打撃があります。これが誰かに役立つことを願っています。

4

1 に答える 1

20

いいえ、特定のエンティティのキ​​ャッシュを無効にすることはできません。

いくつかのオプションがあります。

  1. ISession.Clear()を使用して、NHibernateのキャッシュからすべてのエンティティをクリアします。
  2. ISession.Evict(obj)を使用して、キャッシュから特定のエンティティをクリアします。
  3. ISessionFactory.Evict(typeof(obj))を使用して、特定のタイプのすべてのエンティティ/オブジェクトをキャッシュから削除します。これは私の意見ではあなたが望んでいるものに最も近いでしょう。
  4. IStatelessSessionを使用して、データベースからオブジェクト/エンティティをフェッチします。これにより、すべてのキャッシュが完全にバイパスされます。
于 2012-10-30T03:20:21.247 に答える