實體驗證錯誤詳解
遇到錯誤消息“一個或多個實體的驗證失敗。查看“EntityValidationErrors”屬性了解更多詳情”時,可以訪問驗證錯誤數組。
在調試過程中,可以通過Visual Studio訪問驗證錯誤數組。但是,手動訪問錯誤也是可行的:
<code class="language-csharp">try { // 代码 context.SaveChanges(); } catch (DbEntityValidationException e) { foreach (var eve in e.EntityValidationErrors) { Console.WriteLine("实体: \"{0}\", 状态: \"{1}\"", eve.Entry.Entity.GetType().Name, eve.Entry.State); foreach(var ve in eve.ValidationErrors) { Console.WriteLine("- 属性: \"{0}\", 错误: \"{1}\"", ve.PropertyName, ve.ErrorMessage); } } throw; }</code>
EntityValidationErrors屬性包含驗證失敗的實體,而ValidationErrors包含屬性級別的錯誤列表。
顯示屬性值:
<code class="language-csharp">foreach(var ve in eve.ValidationErrors) { Console.WriteLine("- 属性: \"{0}\", 值: \"{1}\", 错误: \"{2}\"", ve.PropertyName, eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName), ve.ErrorMessage); }</code>
使用Debug.Write:
<code class="language-csharp">Debug.Write("- 属性: \"{0}\", 值: \"{1}\", 错误: \"{2}\"", ve.PropertyName, eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName), ve.ErrorMessage);</code>
包含詳細消息的自定義異常:
此異常以格式化消息記錄驗證錯誤:
<code class="language-csharp">public class FormattedDbEntityValidationException : Exception { public override string Message => InnerException != null ? InnerException?.ToDetailedString() : ""; }</code>
重寫SaveChanges:
<code class="language-csharp">public override int SaveChanges() { try { return base.SaveChanges(); } catch (DbEntityValidationException e) { throw new FormattedDbEntityValidationException(e); } }</code>
這確保了驗證細節將顯示在錯誤日誌(例如Elmah)中。
以上是如何有效處理和調試實體驗證錯誤在實體框架中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!