猿问

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

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

当用代码优先方法播种我的数据库时,我遇到了这个错误。

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

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

这是与我以前的模型一起工作的,但是我做了一些修改,我在下面解释如下:

  • 我有一个名为Status的枚举,我将它更改为一个名为Status的类。
  • 我将类ApplicantsPositionHistory更改为同一个表的2个外键

对不起,代码太长了,但我得把它全部粘贴起来。异常将在以下代码的最后一行中抛出。

namespace Data.Model{  
    public class Position
    {
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]   
        public int PositionID { get; set; }

        [Required(ErrorMessage = "Position name is required.")]
        [StringLength(20, MinimumLength = 3, ErrorMessage = "Name should not be longer than 20 characters.")]
        [Display(Name = "Position name")]              
        public string name { get; set; }

        [Required(ErrorMessage = "Number of years is required")] 
        [Display(Name = "Number of years")]        
        public int yearsExperienceRequired { get; set; }

        public virtual ICollection<ApplicantPosition> applicantPosition { get; set; }
    }

    public class Applicant
    {
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]      
        public int ApplicantID { get; set; }

        [Required(ErrorMessage = "Name is required")] 
        [StringLength(20, MinimumLength = 3, ErrorMessage="Name should not be longer than 20 characters.")]
        [Display(Name = "First and LastName")]
        public string name { get; set; }

        [Required(ErrorMessage = "Telephone number is required")] 
        [StringLength(10, MinimumLength = 3, ErrorMessage = "Telephone should not be longer than 20 characters.")]
        [Display(Name = "Telephone Number")]
        public string telephone { get; set; }

        [Required(ErrorMessage = "Skype username is required")] 
        [StringLength(10, MinimumLength = 3, ErrorMessage = "Skype user should not be longer than 20 characters.")]
        [Display(Name = "Skype Username")]


    }


饮歌长啸
浏览 1586回答 3
3回答

慕田峪9158850

老实说,我不知道如何检查验证错误的内容。VisualStudio向我展示了它是一个包含8个对象的数组,因此有8个验证错误。实际上,如果在调试期间钻入Visualstudio中的数组,您应该会看到错误。但是,您也可以捕获异常,然后将错误写入某个日志存储区或控制台:try{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Your&nbsp;code... &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Could&nbsp;also&nbsp;be&nbsp;before&nbsp;try&nbsp;if&nbsp;you&nbsp;know&nbsp;the&nbsp;exception&nbsp;occurs&nbsp;in&nbsp;SaveChanges &nbsp;&nbsp;&nbsp;&nbsp;context.SaveChanges();}catch&nbsp;(DbEntityValidationException&nbsp;e){ &nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(var&nbsp;eve&nbsp;in&nbsp;e.EntityValidationErrors) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("Entity&nbsp;of&nbsp;type&nbsp;\"{0}\"&nbsp;in&nbsp;state&nbsp;\"{1}\"&nbsp;has&nbsp;the&nbsp;following&nbsp;validation&nbsp;errors:", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eve.Entry.Entity.GetType().Name,&nbsp;eve.Entry.State); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(var&nbsp;ve&nbsp;in&nbsp;eve.ValidationErrors) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("-&nbsp;Property:&nbsp;\"{0}\",&nbsp;Error:&nbsp;\"{1}\"", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ve.PropertyName,&nbsp;ve.ErrorMessage); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;throw;}EntityValidationErrors是一个集合,它表示无法成功验证的实体和内部集合。ValidationErrors每个实体都是属性级别上的错误列表。这些验证消息通常有助于找到问题的根源。编辑几点小小的改进:这个价值在内部循环中可以包括以下违规属性:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(var&nbsp;ve&nbsp;in&nbsp;eve.ValidationErrors) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("-&nbsp;Property:&nbsp;\"{0}\",&nbsp;Value:&nbsp;\"{1}\",&nbsp;Error:&nbsp;\"{2}\"", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ve.PropertyName, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ve.ErrorMessage); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}同时调试Debug.Write可能比Console.WriteLine因为它适用于所有类型的应用程序,而不仅仅是控制台应用程序(感谢@Bart在下面的注释中给出的说明)。用于正在生产和使用的web应用程序埃尔马对于异常日志记录,对我来说创建自定义异常和覆盖非常有用。SaveChanges才能抛出这个新的异常。自定义异常类型如下所示:public&nbsp;class&nbsp;FormattedDbEntityValidationException&nbsp;:&nbsp;Exception{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;FormattedDbEntityValidationException(DbEntityValidationException&nbsp;innerException)&nbsp;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base(null,&nbsp;innerException) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;override&nbsp;string&nbsp;Message &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;innerException&nbsp;=&nbsp;InnerException&nbsp;as&nbsp;DbEntityValidationException; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(innerException&nbsp;!=&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;sb&nbsp;=&nbsp;new&nbsp;StringBuilder(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.AppendLine(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.AppendLine(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(var&nbsp;eve&nbsp;in&nbsp;innerException.EntityValidationErrors) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.AppendLine(string.Format("-&nbsp;Entity&nbsp;of&nbsp;type&nbsp;\"{0}\"&nbsp;in&nbsp;state&nbsp;\"{1}\"&nbsp;has&nbsp;the&nbsp;following&nbsp;validation&nbsp;errors:", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eve.Entry.Entity.GetType().FullName,&nbsp;eve.Entry.State)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(var&nbsp;ve&nbsp;in&nbsp;eve.ValidationErrors) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.AppendLine(string.Format("--&nbsp;Property:&nbsp;\"{0}\",&nbsp;Value:&nbsp;\"{1}\",&nbsp;Error:&nbsp;\"{2}\"", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ve.PropertyName, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ve.ErrorMessage)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.AppendLine(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sb.ToString(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;base.Message; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}和SaveChanges可以用下列方式覆盖:public&nbsp;class&nbsp;MyContext&nbsp;:&nbsp;DbContext{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;override&nbsp;int&nbsp;SaveChanges() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;base.SaveChanges(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(DbEntityValidationException&nbsp;e) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;newException&nbsp;=&nbsp;new&nbsp;FormattedDbEntityValidationException(e); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;newException; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}几点意见:Elmah在Web界面或发送的电子邮件中显示的黄色错误屏幕(如果您已经配置了的话)现在将验证细节直接显示在消息的顶部。覆盖Message属性在自定义异常中,而不是覆盖。ToString()具有标准的ASP.NET“死亡黄屏幕(YSOD)”也显示此消息的好处。与Elmah相比,YSOD显然不使用ToString(),但两者都显示Message财产。包装原件DbEntityValidationException作为内部异常,可以确保原始堆栈跟踪仍然可用,并显示在Elmah和YSOD中。通过在行上设置断点throw newException;您可以简单地检查newException.Message属性作为文本,而不是钻入验证集合,这有点尴尬,而且似乎对每个人都不容易工作(请参阅下面的注释)。
随时随地看视频慕课网APP
我要回答