2011-11-30 3 views
0

NHを使用して、いくつかのプロパティとリスト<Attachments>添付ファイル(インスタンスがlcocationの1対多リレーション)を持つlocationというオブジェクトにDBをマップしています。は、n-tier Webアプリケーションで遅延ロードを実行できません

{"Initializing[Location#543c7367-08fa-4469-a252-8e2c6163be22]-failed 

いい加減に初期化するために:私はlocation.attachmentsコレクションにアクセスが、例外を取得しようとするコード内のいくつかの後の時点で

public IList<T> GetAllByExpression(Expression<Func<T,bool>> expression) 
     { 
      using (ISession session = NHibernateHelper.OpenSession()) 
      { 
       return session.Query<T>().Where(expression).ToList(); 
      } 
     } 

私はlocation istanceを初期化するためにラムダ式を使用しますロールのコレクション:Location.Attachments、no セッションまたはセッションが閉じられました "}

私はセッションが閉じていることを理解していますが、あまりできません。

私はセッションが閉じていることを理解していますが、私ができることはあまりありません。

私はジレンマを持っています: 1)コードはDBからフェッチした後にコレクションを使用し、セッションをまだ開いておく必要があります。 セッションを開いたままにするのは悪い習慣です。 (usingなし)。

2)アプリケーション実行時にセッションを開いたままにしても、n層のWebアプリケーションを構築しています。 DALは一般的であり、実装のセッション(この場合はNH)を公開しないでください。

3)熱心な読み込みが解決策だと思われますが、それは無駄です。他のオブジェクトのリストを持つオブジェクトの場合は、すべてのデータを熱心に読み込む必要があります。 (それは繰り返しても続くことがあります)

どうすればよいですか?あなたは、セッションを閉じたか、あなたはその1とは別のセッションでコレクションをロードしようとされた後、コレクションをロードしようとしているように見えます

:上

TIA

答えて

1

Jasonが示唆するように、あなたがセッションを終了したからです。

Webフォームを使用している場合は、セッションごとにHttp要求の開始時にセッションが開かれ、Http要求の終了時にセッションが開かれます。 (それらのRequestBegin/RequestEndイベントのグローバルasax)

これは、遅延ロードを可能にします。

また、リポジトリに渡すフェッチ戦略を実装することで、必要なデータを賢明に取得して、「この関連データを取得しながらルートを取得する」ことができます。

3

サイキックデバッグルートエンティティをロードしました。

これを行わないでください。

+0

私はセッションを永遠に開くことができませんか? –

+0

@Elad Benda:あなたはしないでください。セッションは、単一の作業単位のために短命でなければなりません。 – jason

+0

私はORMからLocationオブジェクトを初期化し、後でその中の 'attachments'コレクションに対処しなければなりませんでした(1対多の関係)。これどうやってするの? –

関連する問題