3

私のアプリでは、特定のユーザーに対して、ユーザーに属するオブジェクトのインスタンスごとに「設定」を取得できるように、3進辞書マッピングを設定しました。私はBazオブジェクトを持っている時はいつでもそう、私はcurrentUser.BazSettings[baz]を経由して、現在のユーザーのバズの設定を検索することができますステートレスセッションを使用した辞書値のレイジールックアップ

public class User 
{ 
    public virtual IDictionary<Baz, BazSettings> BazSettings { get; set; } 

    //... 

:それは私のようなものを持っている、です。

私はこれを行うにはステートレスセッションを使用できるようにしたいと思いますが、私はこのコードで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エラーメッセージには、「no session or session was closed」というテキストが含まれています。ステートレスセッションを使用する場合、エンティティはセッションに接続されていないため、これは理にかなっています。しかし、私はこのルックアップを実行するためにステートレスセッションを使用する方法があると思います。

ステートレスセッションを使用して検索を実行するにはcurrentUser.BazSettings[baz]

答えて

0

ステートレスセッションは、彼らがステートレスあり、正確ので、遅延ロードをサポートしていません:彼らは彼らで取得エンティティに関するを追跡しません。

これを機能させる唯一の方法は、コレクションを読み込むことです。しかし、なぜあなたは必要なものを提供していないのであれば、でステートレスセッションを使用したいのですか?

+0

私はデータベースからデータを読み込みたいので、ステートレスセッションを使いたいです。私がやったことは、ステートレスセッションでHQLクエリを使うことでした。それはうまくいくようです。 –

+0

ステートフルセッションは、単なる文章のためのものではありません。レイジーローディングとキャッシングは、それらによって提供される2つの重要な機能です。 –

0

ステートレスセッションを使用して実行される操作は関連付けられたインスタンスにカスケードされず、ステートレスセッションによってコレクションは無視されるため、IStatelessSessionの代わりにISessionを使用する必要があります。

+0

カスケードはこれとは関係ありません。 –

+0

はい、ディエゴ、あなたは正しいです、ありがとう。 –

関連する問題