0

私のWebアプリケーションでは、リクエストサイクルのどこかで、リポジトリの次のメソッドを呼び出します。

     repository.Delete(objectToDelete);   

これはNHibernateの実装です。

    public void Delete(T entity)
    {
        if (!session.Transaction.IsActive)
        {
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.Delete(entity);
                transaction.Commit();
            }
        }
        else
        {
            session.Delete(entity);
        }
    }

そして、session.Delete(entity)(usingステートメント内)が失敗します-これは問題ありません。データベースにいくつかの制約があり、これは私が期待していたことです。ただし、Global.asax.csでのリクエストの最後に、次のコードでセッションを閉じます。

    protected void Application_EndRequest(object sender, EventArgs e)
    {
        ISession session = ManagedWebSessionContext.Unbind(HttpContext.Current, sessionFactory);

        if (session != null)
        {
            if (session.Transaction != null && session.Transaction.IsActive)
            {
                session.Transaction.Rollback();
            }
            else
            {
                session.Flush();
            }
            session.Close();
        }
    }

これは、オブジェクトの削除に使用されたのと同じセッションです。そして今、いつ:

session.Flush();

が呼び出されると、NHibernateは同じDELETE操作を実行しようとします。これにより、例外がスローされ、アプリケーションがクラッシュします。以前に(リポジトリレベルで)例外を処理したことがあり、preety UIメッセージボックスを表示しているため、正確には私が望んでいたものではありません。

そのsession.Flushが呼び出されたときに、NHibernateがDELETE(および他のシナリオではUPDATE操作を推測する)アクションを再度実行しようとするのを防ぐにはどうすればよいですか?Basicall私はそのApplication_EndRequestを設計していないので、それがすべてをフラッシュするための良いアプローチであるかどうかはわかりません。

ありがとう

4

1 に答える 1

1

NHibernate のフラッシュ モードは、デフォルトで「auto」に設定されています。これは、(とりわけ) トランザクションをコミットすると NHibernate がフラッシュし、削除が失敗することを意味します。

リクエストの最後に、手動でセッションを再度フラッシュし、NHibernate に再度削除を行うように指示します (アクティブなトランザクションがないため)。

これが期待どおりに機能しない理由は、あなたの期待が間違っているからです。NHibernate セッションは作業単位です。つまり、アプリケーションが 1 つの要求で行うすべてのことです。トランザクションはまったく無関係です。セッションのフラッシュが最初に失敗するという事実は、2 回目に失敗する理由でもあります。

NHibernate が 2 回目の削除を実行するのを防ぎたい場合は、2 回フラッシュするのではなく、1 回だけフラッシュする必要があります。トランザクションをコミットするか、手動で実行します。

多少関係のないメモ: NHibernate を使用していて、トランザクションが間違っています。後で大きな問題を引き起こします。Web アプリケーションで NHibernate を使用する方法については、いくつかの優れたリソースがオンラインにあります。

于 2012-07-17T12:40:43.303 に答える