Try   HackMD

修正 一個或多個實體的驗證失敗。如需詳細資料,請參閱'EntityValidationErrors' 屬性。

通常這段是發生在資料庫寫入前檢查有異常,都是這一段的時候
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' 屬性」的問題?