すべてをプリロードするのではなく、一度ロードしてから、アクセス時に保持することをお勧めします。
NHibernate は 2 つの異なるキャッシュを維持し、基盤となるデータ ストアとの同期を適切に維持します。デフォルトでは、セッションごとに「一次」キャッシュと呼ばれるものを使用しますが、それはあなたが望んでいるものではないと思います。キャッシングに関する nhibernate faq ページで違いについて読むことができます
2 番目のレベルのキャッシュが必要だと思います (これはアプリ全体で利用できます)。NHContribからキャッシュ プロバイダーを取得する必要があります(NHibernate のバージョンと一致するバージョンをダウンロードします)。SysCache2 プロバイダーは、アプリケーションがデータベースに書き込む唯一のものである限り、おそらくシナリオに最も簡単に設定できます。他のプロセスが書き込みを行う場合、同期を維持したい場合は、すべてが仲介として同じキャッシュを使用していることを確認する必要があります。
2 番目のレベルのキャッシュは、必要に応じて設定できるタイムアウトで構成されます。無限にできるとは思わないでください。ただし、必要に応じて長期間に設定できます (おそらく、時々 DB に戻るのは悪い考えではありません)。前もってすべてをプリロードしたい場合は、global.asax の Application_Start メソッドからすべてのエンティティにアクセスできますが、これは必須ではありません。
キャッシュを使用するには、セッション ファクトリを構成する必要があります。セッションファクトリを流暢に構成するときに .Cache(...) メソッドを呼び出します。これは比較的自明です。
また、エンティティ マッピングと関係マッピングの両方で Cache.ReadWrite() を設定する必要があります。これは、規則に従って行うか、流暢なマッピングで Cache.ReadWrite() を呼び出すことによって行うことができます。
何かのようなもの:
public class RecipeMap : ClassMap<Recipe> {
public RecipeMap () {
Cache.ReadWrite();
Id(x => x.Id);
HasManyToMany(x => x.Ingredients).Cache.ReadWrite();
}
}
マッピングの Cache 呼び出しでは、ReadOnly など、必要なものを指定できます。NonStrictReadWrite は興味深いものです。パフォーマンスを大幅に向上させることができますが、キャッシュから古いデータを読み取るリスクが高くなります。