ASP.NET MVC 3アプリケーションでは、EF4.2を使用しています。私のデータベースには、列に固有の制約があります。
何が得られるかを確認するために同じデータを挿入しようとしましたが、次のエラーが発生します。
エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください。
内部例外の内部では、一意の制約に関する完全なエラーを確認できます。しかし、どうすればこの例外を一意にキャッチして、ユーザーにこれを伝えることができますか?
同じ値をもう一度入力しています。
これが私が現在していることです:
try
{
UpdateModel<ConditionType>(conditionType, null, null, new string[] { "ConditionTypeId" });
_conditionTypeRepository.Save();
return RedirectToAction("conditiontype");
}
catch (Exception ex)
{
ModelState.AddModelError("", "There was an error while updating: " + ex.Message);
}
しかし、これは一般的なアプローチです。私がやりたいのは、具体的なメッセージを提供することです。
何かご意見は?
編集:
私は以下を疲れましたが、今回はそれを捕まえませんでした:
catch (SqlException ex)
{
if (ex.Number == 2627)
{
ModelState.AddModelError("", "You are entering the same value again.");
}
ModelState.AddModelError("", "There was an error while updating the value: " + ex.Message);
}
少し掘り下げてみるとSystem.Data.Entity.Infrastructure.DbUpdateException
、例外番号を含まない例外タイプがスローされることがわかりました。
編集:
ここで私が問題を解決する方法を説明しますが、それが問題を解決する最良の方法ではないと確信しています。このコードをリファクタリングする方法はありますか?
catch (Exception ex) {
if (ex.InnerException.InnerException.GetType() == typeof(SqlException)) {
if (((SqlException)ex.InnerException.InnerException).Number == 2627)
ModelState.AddModelError("", "You are entering the same value again.");
else
ModelState.AddModelError("", "There was an error while updating the value: " + ex.Message);
} else {
ModelState.AddModelError("", "There was an error while updating the value: " + ex.Message);
}
}