0

NHibernateに問題がありISessionます。何か間違ったことをデータベースに永続化しようとすると(たとえば、XYZ列に重複キーを持つエンティティを保存する)、ロールバックしTransactionます。ISessionインスタンスはBROKEN/INVALID状態になり、その後はレコードが保持されません。毎回、NHibernat最初の問題について通知する別の例外がスローされます。

私はのようなISessionメソッドを使用しましFlush, Clear, Closeたが、私の問題は存在します。別のアプローチは、から別のISessionインスタンスを要求することですISessionFactoryが、これを使用すると、別の奇妙な問題が発生しますillegal attempt to associate a collection with two open sessions

別のインスタンスを再要求せずにISessionインスタンスを回復するにはどうすればよいISessionFactoryですか?

前もって感謝します :)

4

2 に答える 2

1

できませんし、すべきではありません。

トランザクションが失敗した場合は、リクエストを中止してエラーを表示する必要があります。

当然の帰結として、セッションの例外は通常のフローの一部であってはなりません。

MVC を使用しているため、エラーを許可した場合のエラー処理の例を次に示します。

public ActionResult CreateFoo(FooModel model)
{
    if (ModelState.IsValid)
    {
        try
        {
            SaveThe(model);
            TheTransaction.Commit();
            return RedirectToAction("Whatever");
        }
        catch (WhateverTheDuplicateKeyExceptionIs)
        {
            ModelState.AddModelError("", "Duplicate XYZ");
        }
    }
    return View();
}
于 2012-04-06T13:04:55.070 に答える
1

ISession を回復することはできません。ドキュメントから:

ISession が例外をスローした場合は、すぐにトランザクションをロールバックし、ISession.Close() を呼び出して、ISession インスタンスを破棄する必要があります。ISession の特定のメソッドは、セッションを一貫した状態のままにしません。

また、ISession の作成は安価なので、再利用しようとする理由はありません。MVC アプリケーションがある場合は、おそらくリクエストごとに ISession が必要です。

于 2012-04-06T13:36:35.247 に答える