实体验证错误详解
遇到错误消息“一个或多个实体的验证失败。查看“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中文网其他相关文章!