4

Castle ActiveRecord を使用して、遅延読み込み時に問題が発生しました。

次の作品(明らかに)

using (new SessionScope())
{
    User singleUser = User.FindFirst(...)
    UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}

特定のコンテキストで (インターセプターを使用して) セッション フィルターを変更する必要があるため、新しい SessionScope を作成します。

using (new SessionScope())
{
    User singleUser;
    EnableVariousFiltersInThisThread();
    using (new SessionScope())
    {
        singleUser = User.FindFirst(...);
    }
    DisableVariousFiltersInThisThread();
    UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}

最後の行 "singleUser.Groups" は、LazyInitializationException: "ロールのコレクションを遅延初期化できませんでした: グループ、セッションまたはセッションが閉じられていません" をスローします。

ただし、他のすべてのセッション操作は正しく機能します。そのため、「singleUser」は現在破棄されている SessionScope にバインドされているようです。なんで?また、これを別の方法で解決するにはどうすればよいでしょうか。

4

2 に答える 2

4

これがNHibernateの仕組みだと思います。

エンティティはすべてセッションに関連付けられており、これを遅延読み込みに使用します。セッションを破棄すると、遅延ロードされたコレクションとプロパティをフェッチできなくなります。この制限を考慮すると、答えは明らかで、セッションの破棄を避けること、または必要なデータを抽出するまでセッションを存続させることです。

内側のスコープは外側と同じです。このスコープ外の遅延読み込みもサポートしていません。

ただし、内部スコープ内で NHibernate をだまして熱心に読み込むようにすれば、この制限を回避できます。.ToList()または、スコープを終了する前に、操作したいコレクションに対して呼び出しなどを行うと、データは外部でも利用できるようになります。

于 2009-10-01T07:01:56.810 に答える
0

私の推測は-理由の一部は「アイデンティティマップ」についてです。遅延ロードされたオブジェクトだけでなく、すべてのオブジェクトもセッションにバインドされます。これにより、2つのオブジェクトがデータベース内の単一の行を表さないようになります。

于 2009-10-01T15:46:22.717 に答える