2012-02-24 4 views
7

テーブルを更新するように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()メソッドの問題点は何ですか?

+0

だけと、Visual Studioのデバッグモードで2つの例外が示されていることを、このような状況に思われるもの –

+0

をたまたま見て、空のキャッチして試してみてください:最初は「System.Data.SqlClient.SqlException」であります*任意の "catch()"型ステートメントによって捕らえられません。 2つ目は、.NETによって捕捉され、前者をInnerExceptionとして含む "System.Data.Entity.Infrastructure.DbUpdateException"です。ただし、後者のみが.NETをクラッシュさせます。最初のものは無視されます。前者がSQLサーバーのような外部プロセスから来ている可能性はありますか? – rocketmonkeys

答えて

0

私が知っている唯一の方法は、1つのtry catchを避ける例外が別のスレッドで例外を持つことです。 EFコードを別のスレッドで実行できますか?例外ダイアログで1度のチャンスで例外スローを有効にすることができます。

1

私は、あなたがテーブル上に持っているのとまったく同じトリガーを試み、エンティティフレームワークを通して対応する(新しい)オブジェクトを保存しようとしました。私が見ることができるから、スローされる例外はSqlExceptionではなくSystem.Data.UpdateException型です。内部例外はSqlExceptionであり、トリガーで発生させたカスタムテストメッセージ( 'SQLからのテストエラー')を含んでいます。これが役に立ったらいいですか

+0

ありがとうございました。問題は、最も基本的な例外タイプでも例外をキャッチできないため、どのタイプであるか把握することができません。あなたが「見ることができるもの」とはどういう意味ですか? – user941238

0

私はこの正確な問題を抱えていました。

私はMVCミニプロファイラを使用してクエリ時間をプロファイルしていました。私がプロジェクトからそれを削除した場合、予期したように例外がキャッチされることがわかりました。

0

2つのものがあります: - 「

  1. あなたはRAISERRORは、SQLExceptionをスローする場合は、10以下の重症度と10のエラーの上にその重症度を設定する必要は情報であり、したがって、ドン例外をスローします。

  2. キャッチEntityException または一般的な例外のキャッチブロックにブレークポイントを設定します。イミディエイトウィンドウで、例外の種類を調べます。ex.GetType();

関連する問題