25

私は自分のアプリの1つでNHibernateの第2レベルのキャッシュを使用することを考え始めました。私はおそらくNHibernate.Caches.SysCache.SysCacheProviderASP.netキャッシュに依存するを使用します。

キャッシュを有効にすることは問題ではありませんでしたが、キャッシュを管理する方法、たとえば、キャッシュから特定のエンティティをプログラムで削除する方法などについて疑問に思っています。

私のアプリケーションはある種の画像データベースです。ユーザーはバックエンドを介して画像をアップロードし、アクセスしてフロントエンドで画像を表示できます/ImageDb/Show?userId=someUserId

データはあまり頻繁に変更されません。また、変更された場合、ユーザーは、このユーザーのキャッシュされたオブジェクトをキャッシュから削除するバックエンドの「キャッシュをクリア」という名前のボタンを気にする必要はありません。

nhibernatesの第2レベルのキャッシュからすべてのキャッシュされたオブジェクトを削除できるソリューションをオンラインで見つけました。しかし、それは私には少しブルートフォースです... 1人のユーザーが自分のデータのキャッシュをクリアしようとしたという理由だけで、数十人のユーザーのキャッシュ全体をクリアしたくありません。

だから私が基本的にやりたかったのは、C#のnhibernatesの第2レベルのキャッシュからキャッシュされたdbオブジェクトを選択的に削除することです。

これは可能ですか?キャッシュプロバイダーにもよると思います。これがASP.netキャッシュプロバイダーで実行できない場合、私は他の組み込み/オープンソースの提案を受け入れます。

4

1 に答える 1

45

sessionFactoryは必要なメソッドを提供します... NHibernateリファレンスの19.3章から:

セッションキャッシュからすべてのオブジェクトを完全に削除するには、ISession.Clear()を呼び出します。第2レベルのキャッシュには、インスタンス、クラス全体、コレクションインスタンス、またはコレクションロール全体のキャッシュ状態を削除するためのメソッドがISessionFactoryに定義されています。

sessionFactory.Evict(typeof(Cat), catId); //evict a particular Cat
sessionFactory.Evict(typeof(Cat)); //evict all Cats
sessionFactory.EvictCollection("Eg.Cat.Kittens", catId); //evict a particular collection of kittens
sessionFactory.EvictCollection("Eg.Cat.Kittens"); //evict all kitten collections
于 2009-11-30T12:08:51.877 に答える