栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

一个或多个实体的验证失败。有关更多详细信息,请参见“ EntityValidationErrors”属性

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一个或多个实体的验证失败。有关更多详细信息,请参见“ EntityValidationErrors”属性

老实说,我不知道如何检查验证错误的内容。Visual Studio向我展示了这是一个包含8个对象的数组,因此出现8个验证错误。

实际上,如果在调试期间在Visual Studio中钻入该阵列,则应该看到错误。但是您也可以捕获异常,然后将错误写出到某些日志存储区或控制台中:

try{    // Your pre...    // Could also be before try if you know the exception occurs in SaveChanges    context.SaveChanges();}catch (DbEntityValidationException e){    foreach (var eve in e.EntityValidationErrors)    {        Console.WriteLine("Entity of type "{0}" in state "{1}" has the following validation errors:", eve.Entry.Entity.GetType().Name, eve.Entry.State);        foreach (var ve in eve.ValidationErrors)        { Console.WriteLine("- Property: "{0}", Error: "{1}"",     ve.PropertyName, ve.ErrorMessage);        }    }    throw;}

EntityValidationErrors
是表示无法成功验证的
ValidationErrors
实体的集合,每个实体的内部集合是属性级别的错误列表。

这些验证消息通常足以找到问题的根源。

编辑

一些小改进:

违规属性的 可以包含在内循环中,如下所示:

        foreach (var ve in eve.ValidationErrors)        { Console.WriteLine("- Property: "{0}", Value: "{1}", Error: "{2}"",     ve.PropertyName,     eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName),     ve.ErrorMessage);        }

尽管调试

Debug.Write
可能比
Console.WriteLine
其更适用,因为它可以在所有类型的应用程序中使用,而不仅仅是控制台应用程序(感谢@Bart在下面的评论中提供他的注释)。

对于在生产中并且使用 Elmah
进行异常日志记录的Web应用程序,事实证明,这对于我创建自定义异常并进行覆盖

SaveChanges
以抛出此新异常非常有用。

自定义异常类型如下所示:

public class FormattedDbEntityValidationException : Exception{    public FormattedDbEntityValidationException(DbEntityValidationException innerException) :        base(null, innerException)    {    }    public override string Message    {        get        { var innerException = InnerException as DbEntityValidationException; if (innerException != null) {     StringBuilder sb = new StringBuilder();     sb.AppendLine();     sb.AppendLine();     foreach (var eve in innerException.EntityValidationErrors)     {         sb.AppendLine(string.Format("- Entity of type "{0}" in state "{1}" has the following validation errors:",  eve.Entry.Entity.GetType().FullName, eve.Entry.State));         foreach (var ve in eve.ValidationErrors)         {  sb.AppendLine(string.Format("-- Property: "{0}", Value: "{1}", Error: "{2}"",      ve.PropertyName,      eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName),      ve.ErrorMessage));         }     }     sb.AppendLine();     return sb.ToString(); } return base.Message;        }    }}

并且

SaveChanges
可以通过以下方式覆盖:

public class MyContext : DbContext{    // ...    public override int SaveChanges()    {        try        { return base.SaveChanges();        }        catch (DbEntityValidationException e)        { var newException = new FormattedDbEntityValidationException(e); throw newException;        }    }}

几点评论:

  • Elmah在Web界面或已发送的电子邮件(如果已配置)中显示的黄色错误屏幕现在直接在消息顶部显示验证详细信息。

  • Message
    在自定义异常中覆盖而不是覆盖属性
    ToString()
    的好处是,标准ASP.NET“死亡黄屏(YSOD)”也显示此消息。与Elmah相反,YSOD显然不使用
    ToString()
    ,但是两者都显示
    Message
    属性。

  • 将原始文件包装

    DbEntityValidationException
    为内部异常可确保原始堆栈跟踪仍然可用,并显示在Elmah和YSOD中。

  • 通过在行上设置一个断点,

    throw newException;
    您可以简单地将
    newException.Message
    属性作为文本进行检查,而不必钻研验证集合,这有点尴尬,而且似乎并不适合所有人(请参见下面的评论)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/596980.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号