ステートレスセッションを使用した辞書値の怠zyluedルックアップ
-
23-10-2019 - |
質問
私のアプリでは、特定のユーザーに対して、ユーザーに属するオブジェクトの各インスタンスの「設定」を取得できるように、三元辞書マッピングを設定します。つまり、私は次のようなものを持っています:
public class User
{
public virtual IDictionary<Baz, BazSettings> BazSettings { get; set; }
//...
だから私が持っているときはいつでも Baz
オブジェクト、私は現在のユーザーのBAZの設定を介して検索できます currentUser.BazSettings[baz]
.
私はこれを行うために無国籍セッションを使用できるようにしたいのですが、私は LazyInitializationException
このコードで:
//int bazId;
using (IStatelessSession session = Global.SessionFactory.OpenStatelessSession())
{
var currentUser = session.Get<User>(Membership.GetUser().ProviderUserKey);
var baz = session.Get<Baz>(bazId);
var bazSettings = currentUser.BazSettings[baz]; // raises `LazyInitializationException`
代わりに使用するとき ISession
, 、その後、問題は消えます。
完全なnhibernateエラーメッセージには、「セッションやセッションが閉じられていない」というテキストが含まれています。これは理にかなっています。これは、ステートレスセッションを使用する場合、エンティティがセッションに接続されていないためです。ただし、このルックアップを実行するために無国籍セッションを使用する方法があると思います。
ステートレスセッションを使用してルックアップを実行するにはどうすればよいですか currentUser.BazSettings[baz]
?
解決
ステートレスセッションは、怠zyなロードをサポートしていません。 ステートレス: :彼らは追跡しません なんでも 彼らと一緒に取得したエンティティについて。
それを機能させる唯一の方法は、コレクションを熱心にロードすることです。しかし、なぜあなたはそうするのですか 欲しいです ステートレスセッションを使用するには、必要なものを明らかに提供しない場合は?
他のヒント
Statelessセッションを使用して実行された操作は、関連するインスタンスにカスケードされないため、ISTATERESSESSESSIONの代わりにISESSIONを使用する必要があり、コレクションはステートレスセッションで無視されます。