私はちょうどNHibernateの使用を開始しました。私は正しく解決する方法がわからないいくつかの問題があります。NHibernateセッション - Windowsアプリケーションでセッションを処理する一般的な方法は何ですか?
私は、CUDといくつかの検索方法を含む汎用リポジトリの作成を始めました。これらのメソッドはそれぞれ、DB操作中に個別のセッション(および必要に応じてトランザクション)を開きます。これを行うときの問題は、関連するコレクション/オブジェクトの遅延読み込みを利用できないことです。
ほとんどすべてのエンティティリレーションは、フルーエントマッピングで.Not.LazyLoad()
であるため、特定のタイプのすべてのエンティティのリストを要求すると、データベース全体がロードされます。私が間違っている場合
は、これを避けるために行うのが最も一般的である何NHibernateは:)
に来るとき、私はまだ完全な初心者だ「原因、私は正しいですか?プログラムが実行されている間、生きているグローバルな静的セッションが1つありますか?何をすべきですか?
リポジトリコードの一部:
public T GetById(int id)
{
using (var session = NHibernateHelper.OpenSession())
{
return session.Get<T>(id);
}
}
あなたの質問は、実際のキャッシュと再利用をobjectに沸く人
var person = m_PersonRepository.GetById(1); // works fine
var contactInfo = person.ContactInfo; // Throws exception with message:
// failed to lazily initialize a collection, no session or session was closed
あなたの答えをありがとう。ドキュメントの章を読んだことがありますが、2番目の文で何を意味するのかはまだ分かりません。遅延読み込みプロパティにアクセスする必要がある場合は、セッションを保持する必要があることを意味しますか?質問に自分のリポジトリコードを追加します。 – l3dx
確かめてください。質問にいくつかの文脈を追加してください。私は答えにもっと具体的に取り上げます。 –
ニース、ありがとう! +1私のリポジトリをリファクタリングします:)私の理解では、セッション/ dbのものは実際のアプリケーションから "階層化されています"ので、リポジトリから削除すると、どこに置くのでしょうか? – l3dx