なぜNHibernateの遅延ロードは、セッションにバインドされていますか?
-
19-09-2019 - |
質問
城の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がスローされます:「なまけ役割のコレクションを初期化に失敗しました:グループは、いかなるセッションまたはセッションが閉じられませんでした」
。しかし、他のすべてのセッションの操作が正しく動作します。だから、「シングルユーザ」は今に配置されたsessionScopeとにバインドされているようです。どうして?そして、どのようにこれは、代替的に解くことができますか?
解決
私ののGUESS のです - その理由の一部は、 "アイデンティティ・マップ" についてです。遅延ロードされたオブジェクトだけでなく、すべてのオブジェクトがセッションにバインドされています。これには2つのオブジェクトがデータベース内の単一の行を表していないを確認します。
他のヒント
私は、これはNHibernateの動作方法であると考えています。
あなたのエンティティは、すべてのセッションに関連付けられており、遅延読み込みのためにこれを使用しています。あなたのセッションを配置する場合は、遅延ロードされたコレクションとプロパティを取得することはできません。この制限を考慮する明白な答えは、セッションを配置しないようにすることです - 。またはあなたが必要なデータを抽出するまでセッションを存続するために、
内側範囲は、外側と変わりません。それはどちらか、この範囲外の遅延読み込みをサポートしていません。
あなたがあなたの内側の範囲内で積極的なロードへのNHibernateをだましている場合、ただし、この制限を回避することができます。また、あなたはスコープを終了する前に、で作業したいコレクションに.ToList()
または類似を呼び出し、データも外で利用できるようになります。