EF Core で SaveChanges / SaveChangesAsync したときに出る DbUpdateException。内側を見ないと原因が分からないことが多い。
この記事では、よくある中身と切り分け手順をざっくりまとめる。
DbUpdateException はラッパー。本質は InnerException同じコード・メールを二重登録したときなど。SQL Server なら 2627 / 2601 系。
存在しない親 ID を参照して保存したとき。関連の付け忘れも多い。
必須列に null や空を送っている。クライアント側バリデーション不足でも起きる。
DbUpdateConcurrencyException(派生)として見えることもある。rowversion 更新競合など。
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateException ex)
{
Console.WriteLine(ex.InnerException?.Message);
foreach (var entry in ex.Entries)
{
Console.WriteLine($"{entry.Entity.GetType().Name} : {entry.State}");
}
throw;
}
InnerException の SQL エラー番号・メッセージを読むDbUpdateException 単体で悩まない。内側を見る