これは機能していたと確信していますが、現在は停止しており、その理由はわかりません。私のクラスは複雑すぎて投稿できませんが、テスト用に簡単なクラスを作成しましたが、まだ発生しています。
データベースで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
発生します)。 )。
何か案は?タイ。