テーブルを更新するようにEntity Frameworkをセットアップしました。更新がRAISERRORを呼び出す代わりに-のトリガーによって傍受されています。私のリポジトリクラスでEntity Framework 4で設定されたトリガでRAISERRORがスローしたSqlExceptionをキャッチするにはどうすればよいですか?
CREATE TRIGGER mySchema.UpdateBusinessObjects
ON mySchema.BusinessObjects
INSTEAD OF UPDATE
AS
RAISERROR(''test error from SQL'',16,1)
RETURN
、私はSQLでRAISERRORによって生成され、SQLExceptionをキャッチしようとしています:
public void SaveBusinessObject(BusinessObject b) {
try {
repo.Entry(b).State = EntityState.Modified;
repo.SaveChanges();
} catch (SqlException ex) {
// handle exception here
}
}
問題は、C#がSqlExceptionをキャッチしていないことです。ハンドルされていない例外( "SqlExceptionがユーザーによって処理されなかった:SQLからのテストエラー")として呼び出し元に渡されます。何?!
EFのSaveChanges()は、何とかtry try catchブロックで例外を上回っているようです。私はEF例外が何らかの一般的な場合にcatch(Exception ex)をキャッチするためにcatchステートメントを切り替えようとしましたが、まだ未処理のSqlExceptionがあります。私はここで何か簡単なものを逃している? SaveChanges()メソッドの問題点は何ですか?
だけと、Visual Studioのデバッグモードで2つの例外が示されていることを、このような状況に思われるもの –
をたまたま見て、空のキャッチして試してみてください:最初は「System.Data.SqlClient.SqlException」であります*任意の "catch()"型ステートメントによって捕らえられません。 2つ目は、.NETによって捕捉され、前者をInnerExceptionとして含む "System.Data.Entity.Infrastructure.DbUpdateException"です。ただし、後者のみが.NETをクラッシュさせます。最初のものは無視されます。前者がSQLサーバーのような外部プロセスから来ている可能性はありますか? – rocketmonkeys