1

すべてのデータベース呼び出しをトランザクションに入れることがベスト プラクティスのようです。そのため、選択アクションをトランザクションに入れたかったのですが、これを行う方法が見つかりません。

このコードを試しましたが、エラーが発生します:

using (var session = GetSession().SessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
    // var session = GetSession();
    var result = session.Query<I>().Where(condition);

    transaction.Commit();

    return result;
}

エラー:

セッション終了!オブジェクト名: 'ISession'。

4

1 に答える 1

3

それ自体の問題ではTransactionありませんが、選択ではなく保存/更新呼び出しにのみトランザクションを使用しますが、それは好みの問題かもしれません (または単に重要なことを知りません)。

問題は、セッションを閉じる前にコレクションを「具体化」していないということです。これはうまくいくはずです:

var result = session.Query<I>.Where(condition).List();

return result;

Whereそれ自体では何もしません。つまり、何かを行うまでフィルターの実行を延期しているだけです。たとえば、フィルターを反復処理します。それまでに Session スコープの外にいる場合 (そう思われる場合)、セッションが閉じているときにデータベースを呼び出すことができないため、例外が発生します。

最初に積極的に ing しないと、遅延ロードされた子アイテムにアクセスできない可能Fetch性がありますが、開いているセッション内にいない場合は、プロキシを介してデータベースを呼び出すことはできません。:)

免責事項

ちなみに、LINQ を使用した EF でも同じことが起こります。

IEnumerable<I> myObjects;

using(var context = new MyDbContext())
{
    myObjects = context.Set<I>.Where(x => x.Name == "Test");
}

foreach(obj in myObjects)
{
    var name = obj.Name; //BOOM! Context is disposed.
}
于 2012-08-31T11:14:27.653 に答える