通常這段是發生在資料庫寫入前檢查有異常,都是這一段的時候
db.SaveChanges();
這邊提供 try catch 的寫法,可以把異常的欄位資料拋出來,用開發工具設中斷點更容易找問題
try
{
db.SaveChanges();
}
catch (DbEntityValidationException ex)
{
foreach (var eve in ex.EntityValidationErrors)
{
Console.WriteLine($"實體 {eve.Entry.Entity.GetType().Name} 驗證失敗:");
foreach (var ve in eve.ValidationErrors)
{
Console.WriteLine($"- 屬性: {ve.PropertyName}, 錯誤: {ve.ErrorMessage}");
}
}
throw;
}
更進階的話,可以把原始寫入的資料也一併讀出來方便偵錯,這邊使用json的方式轉換
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
try
{
db.SaveChanges();
}
catch (DbEntityValidationException ex)
{
foreach (var eve in ex.EntityValidationErrors)
{
Console.WriteLine($"實體 {eve.Entry.Entity.GetType().Name} 驗證失敗:");
// 嘗試序列化,並捕捉可能失敗的情況
try
{
var settings = new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore, // 忽略循環參考
Error = (sender, args) =>
{
// 忽略無法序列化的欄位錯誤,不拋出例外
args.ErrorContext.Handled = true;
}
};
var entityJson = JsonConvert.SerializeObject(eve.Entry.Entity, Formatting.Indented, settings);
Console.WriteLine("發生錯誤的資料內容:");
Console.WriteLine(entityJson);
}
catch (Exception serializeEx)
{
Console.WriteLine($"[警告] 無法序列化實體資料:{serializeEx.Message}");
}
foreach (var ve in eve.ValidationErrors)
{
Console.WriteLine($"- 屬性: {ve.PropertyName}, 錯誤: {ve.ErrorMessage}");
}
}
throw;
}
如何解決「一個或多個實體的驗證失敗。如需詳細資料,請參閱 'EntityValidationErrors' 屬性」的問題?
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up