Entity Framework を使用して SQL データにアクセスしています。データベース スキーマにいくつかの制約があり、これらの制約が原因で発生する例外をどのように処理すればよいか考えています。
例として、2 人のユーザーが (ほぼ) 同一のエンティティを同時に DB に追加しようとすると、次の例外が発生します。
System.Data.UpdateException
"An error occurred while updating the entries. See the InnerException for details."
(inner exception) System.Data.SqlClient.SqlException
"Violation of UNIQUE KEY constraint 'Unique_GiftId'. Cannot insert duplicate key in object 'dbo.Donations'.\r\nThe statement has been terminated."
この特定の例外を適切にキャッチするにはどうすればよいですか?
汚い解決策:
catch (UpdateException ex)
{
SqlException innerException = ex.InnerException as SqlException;
if (innerException != null && innerException.Message.StartsWith("Violation of UNIQUE KEY constraint 'Unique_GiftId'"))
{
// handle exception here..
}
else
{
throw;
}
}
このアプローチは機能しますが、いくつかの欠点があります。
- タイプ セーフなし: コードは、一意の列の名前を含む例外メッセージに依存します。
- SqlCLient クラスへの依存 (壊れた抽象化)
これに対するより良い解決策を知っていますか?すべてのフィードバックをありがとう..
注:アプリケーション層内で手動で制約をコーディングしたくありません。DB に入れたいのです。