0

EntityFrameworkの例外をどこでキャッチするかを理解するのに苦労しています。私はSaveChanges並行性の例外をカバーしていますが、他の例外(サーバーがダウンしたためのタイムアウトなど)をキャッチするための一般的なルールを見つけるのに苦労しています。

私はWindowsクライアントアプリケーションを実行しているので、例外は「エラー」Webページを吐き出すだけでなく、アプリケーションを続行するためのオプションを提供する必要があります(他のウィンドウが開いている可能性があるため、これは単純なアプリではありません)。

これは、ADO.netを直接使用する場合、非常に簡単に理解できます。接続を開いてクエリを実行するときに例外をトラップしますが、接続を開いてクエリをEF4(この場合はデータベースファースト)を使用して実行するタイミングは正確はわかりません。)。

いくつかの単純なケースがあります(たとえば、またはIQueryableを呼び出して、で実際に列挙子を実行する場合)が、それほど簡単には見つからない場合もあります。たとえば、WinFormコントロールにを割り当てる場合は、に依存します。コントロールの動作(私が常に制御しているわけではありません)、実際にクエリを実行する場合と実行しない場合があります(一部のコントロールは後で呼び出すときに実行します)。ToListToArrayIQueryableDataSourceDataBind

試行錯誤で(または単に巨大なtry/catchブロックを実行して)これを実行できることはわかっていますが、これを実行するためのより一般的な方法を見つけようとしています。

onexceptionでイベントのようなものを検索しようとしましたObjectContextが、近くに何も見つかりませんでした。この問題について見つけたのは、例外SaveChangesと同時実行例外に関するもので、これについては説明しました。

どこに行くべきかについてのヒントはありますか?

4

1 に答える 1

0

あなたはの概念に精通していますunit of workか?これは通常、context開始時と終了時の境界を定義します。次に、例外処理を作業単位内またはその周辺に配置して、特定の例外を処理できます。

ここに1つのアイデアがあります。

public void Execute(Action<DbContext> action)
{
    try
    {
       using(var context = new MyContext())
       {
           action(context);
           context.SaveChanges();
       }
    }
    catch(ConcurrencyException exception)
    {
    }
    catch(ValidationException exception)
    {
    }
    catch(SqlException exception)
    {
    }
}
于 2012-11-27T19:57:08.720 に答える