これは機能していたと確信していますが、現在は停止しており、その理由はわかりません。私のクラスは複雑すぎて投稿できませんが、テスト用に簡単なクラスを作成しましたが、まだ発生しています。
データベースで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;
    }
}
上記のオブジェクトa1でa3は、挿入が失敗したときにエラーをスローする必要があります (出力ウィンドウに表示されるように動作します) が、catch {}ステートメントによってキャッチされず、ステップスルーしてtx.commit実行a2され、データベースに永続化されます (これがshouldn't発生します)。 )。
何か案は?タイ。