1

これは機能していたと確信していますが、現在は停止しており、その理由はわかりません。私のクラスは複雑すぎて投稿できませんが、テスト用に簡単なクラスを作成しましたが、まだ発生しています。

データベースでnullではないいくつかのプロパティを持つクラス「abc」を作成しました。クラスのインスタンスを作成し、意図的にプロパティを null のままにして、エラーが発生するようにしました。出力ウィンドウに、エラーが次のように表示されます。

タイプ 'System.Data.SqlClient.SqlException' の初回例外が System.Data.dll で発生しました

しかし、例外は私のコードにバブルアップしておらず、問題なく実行されます。行はデータベースにありません。SQL プロファイラーから SQL をコピーすると、「列に null を挿入できません....」という正しいエラーが表示されます。

問題は、トランザクション内でいくつかのオブジェクトを作成していて、1 つが失敗した場合、すべてをロールバックできるようにエラーがスローされることを期待していますが、エラーがバブルしていないため、それらをキャッチできないため、ロールバックできません。

以下は実際にはコードではありませんが、私が何を意味するかを示すためのものです:

using (NHibernate.ITransaction tx = Session.BeginTransaction())
{
    try
    {
        // Should Fail
        ABC a1 = new ABC();
        a1.prop1 = "1234";
        Session.SaveOrUpdate(a1);

        // Should Save
        ABC a2 = new ABC();
        a2.prop1 = "1234";
        a2.prop2 = "1234";
        Session.SaveOrUpdate(a2);

        // Should Fail
        ABC a3 = new ABC();
        Session.SaveOrUpdate(a3);

        tx.Commit()

    }
    catch (Exception ex)
    {
        tx.Rollback()
        throw ex;
    }
}

上記のオブジェクトa1a3は、挿入が失敗したときにエラーをスローする必要があります (出力ウィンドウに表示されるように動作します) が、catch {}ステートメントによってキャッチされず、ステップスルーしてtx.commit実行a2され、データベースに永続化されます (これがshouldn't発生します)。 )。

何か案は?タイ。

4

1 に答える 1

0

Session.Close()トランザクションのコミット後に呼び出してみてください。

遅延読み込みと NHibernate キャッシュが奇妙な動作をすることがあります。

于 2013-02-04T15:01:29.373 に答える