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

2023-11-21

我在使用代码优先方法为数据库播种时遇到此错误。

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

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

这是与我以前的模型一起使用的,但我做了一些更改,我在下面解释:

  • 我有一个名为 Status 的枚举,我将其更改为一个名为 Status 的类
  • 我将申请人职位历史记录更改为同一个表有 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")]
        public string skypeuser { get; set; }

        public byte[] photo { get; set; }

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

    public class ApplicantPosition
    {
        [Key]
        [Column("ApplicantID", Order = 0)]
        public int ApplicantID { get; set; }

        [Key]
        [Column("PositionID", Order = 1)]
        public int PositionID { get; set; }

        public virtual Position Position { get; set; }

        public virtual Applicant Applicant { get; set; }

        [Required(ErrorMessage = "Applied date is required")] 
        [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
        [Display(Name = "Date applied")]     
        public DateTime appliedDate { get; set; }

        [Column("StatusID", Order = 0)]
        public int StatusID { get; set; }

        public Status CurrentStatus { get; set; }

        //[NotMapped]
        //public int numberOfApplicantsApplied
        //{
        //    get
        //    {
        //        int query =
        //             (from ap in Position
        //              where ap.Status == (int)Status.Applied
        //              select ap
        //                  ).Count();
        //        return query;
        //    }
        //}
    }

    public class Address
    {
        [StringLength(20, MinimumLength = 3, ErrorMessage = "Country should not be longer than 20 characters.")]
        public string Country { get; set; }

        [StringLength(20, MinimumLength = 3, ErrorMessage = "City  should not be longer than 20 characters.")]
        public string City { get; set; }

        [StringLength(50, MinimumLength = 3, ErrorMessage = "Address  should not be longer than 50 characters.")]
        [Display(Name = "Address Line 1")]     
        public string AddressLine1 { get; set; }

        [Display(Name = "Address Line 2")]
        public string AddressLine2 { get; set; }   
    }

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

        public ApplicantPosition applicantPosition { get; set; }

        [Column("oldStatusID")]
        public int oldStatusID { get; set; }

        [Column("newStatusID")]
        public int newStatusID { get; set; }

        public Status oldStatus { get; set; }

        public Status newStatus { get; set; }

        [StringLength(500, MinimumLength = 3, ErrorMessage = "Comments  should not be longer than 500 characters.")]
        [Display(Name = "Comments")]
        public string comments { get; set; }

        [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
        [Display(Name = "Date")]     
        public DateTime dateModified { get; set; }
    }

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.IO;

namespace Data.Model
{
    public class HRContextInitializer : DropCreateDatabaseAlways<HRContext>
    {
        protected override void Seed(HRContext context)
        {
            #region Status
            Status applied = new Status() { status = "Applied" };
            Status reviewedByHR = new Status() { status = "Reviewed By HR" };
            Status approvedByHR = new Status() { status = "Approved by HR" };
            Status rejectedByHR = new Status() { status = "Rejected by HR" };
            Status assignedToTechnicalDepartment = new Status() { status = "Assigned to Technical Department" };
            Status approvedByTechnicalDepartment = new Status() { status = "Approved by Technical Department" };
            Status rejectedByTechnicalDepartment = new Status() { status = "Rejected by Technical Department" };

            Status assignedToGeneralManager = new Status() { status = "Assigned to General Manager" };
            Status approvedByGeneralManager = new Status() { status = "Approved by General Manager" };
            Status rejectedByGeneralManager = new Status() { status = "Rejected by General Manager" };

            context.Status.Add(applied);
            context.Status.Add(reviewedByHR);
            context.Status.Add(approvedByHR);
            context.Status.Add(rejectedByHR);
            context.Status.Add(assignedToTechnicalDepartment);
            context.Status.Add(approvedByTechnicalDepartment);
            context.Status.Add(rejectedByTechnicalDepartment);
            context.Status.Add(assignedToGeneralManager);
            context.Status.Add(approvedByGeneralManager);
            context.Status.Add(rejectedByGeneralManager); 
            #endregion    

            #region Position
            Position netdeveloper = new Position() { name = ".net developer", yearsExperienceRequired = 5 };
            Position javadeveloper = new Position() { name = "java developer", yearsExperienceRequired = 5 };
            context.Positions.Add(netdeveloper);
            context.Positions.Add(javadeveloper); 
            #endregion

            #region Applicants
            Applicant luis = new Applicant()
            {
                name = "Luis",
                skypeuser = "le.valencia",
                telephone = "0491732825",
                photo = File.ReadAllBytes(@"C:\Users\LUIS.SIMBIOS\Documents\Visual Studio 2010\Projects\SlnHR\HRRazorForms\Content\pictures\1.jpg")
            };

            Applicant john = new Applicant()
            {
                name = "John",
                skypeuser = "jo.valencia",
                telephone = "3435343543",
                photo = File.ReadAllBytes(@"C:\Users\LUIS.SIMBIOS\Documents\Visual Studio 2010\Projects\SlnHR\HRRazorForms\Content\pictures\2.jpg")
            };

            context.Applicants.Add(luis);
            context.Applicants.Add(john); 
            #endregion

            #region ApplicantsPositions
            ApplicantPosition appicantposition = new ApplicantPosition()
            {
                Applicant = luis,
                Position = netdeveloper,
                appliedDate = DateTime.Today,
                StatusID = 1
            };

            ApplicantPosition appicantposition2 = new ApplicantPosition()
            {
                Applicant = john,
                Position = javadeveloper,
                appliedDate = DateTime.Today,
                StatusID = 1
            };        

            context.ApplicantsPositions.Add(appicantposition);            
            context.ApplicantsPositions.Add(appicantposition2); 
            #endregion

            context.SaveChanges(); --->> Error here
        }
    }
}

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

实际上,如果在调试期间在 Visual Studio 中深入查看该数组,您应该会看到错误。但您也可以捕获异常,然后将错误写入某些日志存储或控制台:

try
{
    // Your code...
    // 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每个实体是属性级别的错误列表。

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

Edit

一些细微的改进:

The value有问题的属性可以包含在内部循环中,如下所示:

        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 在下面的评论中的注释)。

对于正在生产和使用的 Web 应用程序Elmah对于异常日志记录,创建自定义异常并覆盖对我来说非常有用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;
        }
    }
}

And 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属性作为文本而不是深入到验证集合中,这有点尴尬,并且似乎并不适合每个人(请参阅下面的评论)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个或多个实体的验证失败。有关更多详细信息,请参阅“EntityValidationErrors”属性[重复] 的相关文章

随机推荐

  • Spring Boot Amazon AWS S3 存储桶文件下载 - 访问被拒绝

    我有一个自动配置的 AWS Spring Boot 应用程序 并且我正在尝试设置一个终端节点 该终端节点将仅从 Amazon S3 中的给定存储桶下载特定文件 我使用 AWS 控制台将 JPEG 文件从我的计算机上传到存储桶中 现在我尝试使
  • 通过云函数读取云存储数据

    我正在尝试对用 Python 构建数据处理管道进行快速概念验证 为此 我想构建一个 Google 函数 当某些 csv 文件被放入云存储中时 该函数将被触发 我也跟着这个 Google Functions Python 教程虽然示例代码确实
  • 可以修改 jQuery ajax 请求中的 cookie 值吗?

    我正在开发一个 Chrome 扩展 它允许用户记录站点的所有 HTTP 请求 修改请求的各个部分 然后重新发送 我希望使用jQuery的ajax方法构造并发送修改后的请求 我已经能够构建请求的其他部分 但据我所知 无法在请求中包含 cook
  • H.264 编解码器解释[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在制作一个支持视频通话的应用程序 并且正在寻找解释 h 264 编解码器结构的教程 文档 我希望能够打包流 将其包装在数据报中 在接收端发送和解
  • iPhone 模拟器/Mac OS 10.8.4 上的简单应用程序崩溃

    今天早上 将 Mac 上的 Mac OS 更新到 10 8 4 后 我在 Xcode 4 6 2 上编写了一些代码 然后按 运行 按钮进行编译 你知道 我没有停止模拟器 只需按 运行 按钮即可编译并运行 然后 应用程序崩溃了 我尝试了其他一
  • ASP.NET Core 在 Web API 中处理自定义响应/输出格式的方法

    我想创建自定义 JSON 格式 它将响应包装在数据中并返回 Content Type 例如 vnd myapi json 目前 我已经创建了一个包装类 我在控制器中返回它 但如果可以在后台处理它会更好 public class ApiRes
  • 建立一个数据库来跟踪哪些用户点击了哪些链接?

    我将尝试进一步详细说明我的问题 我最近在我的大学获得了一个入门级兼职开发人员职位 以努力提高我的开发技能 虽然我过去使用过 MySQL 但只是在一门课程中简要介绍了它 因为我主要是前端人员 HTML CSS JS 不管怎样 雇用我的部门有一
  • 如何保护我的进程不被杀死?

    我们在 Linux 之上有一个关键任务服务器程序 我们不希望其他人意外终止它 如果有人终止它或它崩溃 我们希望它重新启动 所以我们计划编写另一个程序 比如说程序B 我们希望程序B和服务器程序能够互相保护 如果我们的服务器程序退出 程序B将重
  • 在 Go 中向特定客户端发送 Websocket 消息(使用 Gorilla)

    我对 Go 很陌生 并且发现自己使用套接字作为我的第一个项目 这是一个多余的问题 但我无法理解如何 将 websocket 更新发送到 Go 中的特定客户端 使用 Gorilla 我试图解决的主要问题是 使用 websockets 和 ES
  • 停止 Jenkins 工作以防新工作开始

    是否可以指定 如果作业 A 被触发多次 则先前的作业将从队列中删除 并且只有最新的作业留在队列中或在有足够的空闲槽位时启动 提前致谢 use execute system groovy script step import hudson m
  • Python 通过写入 stdin 取消 raw_input/input?

    首先 我使用的是 python 2 7 5 和 Windows x64 我的应用程序针对的是这些参数 我需要一种方法来在一段时间过去后取消 raw input 目前 我的主线程启动两个子线程 一个是计时器 threading Timer 另
  • PyCharm 中的“未指定可执行文件”错误

    当我尝试在 PyCharm 中运行 python 脚本时 收到以下错误消息 error running myscript Executable is not specified 并且脚本不运行 如何通过 PyCharm 运行我的脚本 您需要
  • 如何将 PIL 图像对象上传到 Discord 聊天而不保存图像?

    我正在尝试将 PIL 图像对象发送到不和谐聊天 但我不想保存文件 我有一个函数可以从互联网收集图像 将它们垂直连接在一起 然后返回一个 PIL Image 对象 下面的代码从我本地计算机上的 PIL Image 对象创建一个文件图像 然后将
  • 使用 AWS API Gateway 请求验证器时启用 CORS

    我成功地使用 CORS 设置了 AWS API Gateway 当请求有效时 我有一个 200 状态代码和 CORS 标头 这很好 但是 当 AWS API Gateway 请求验证器检测到无效输入时 状态代码为 400 但未发送 CORS
  • Spring Data Rest 将自定义端点添加到特定存储库

    我想将自定义搜索端点添加到我现有的用户存储库 我的用户存储库如下所示 RepositoryRestResource collectionResourceRel users path users public interface UserRe
  • 在 Patchwork 中手动定位图例

    我想将图例 所有绘图共有 放置在拼凑布局的空白区域中 从我在网上可以找到的内容来看 我无法使用手动定位图例legend position如果我也使用guides collect 但可以使用左 右等 我尝试过使用l lt get legend
  • 如何查询内存中的一个DataTable来填充另一个数据表

    我正在尝试更新 Microsoft 报告 它的作用是写出有多少客户被排除在转换过程之外以及原因 目前 该程序将所有已删除的客户端写回到服务器 然后查询它以将结果填充到特殊表中 这是当前的查询 SELECT DeletedClients Re
  • 不同级别logback不同文件

    我的 logback xml 中有这个附加程序
  • 为什么我收到错误无法等待“void”?

    private Queue
  • 一个或多个实体的验证失败。有关更多详细信息,请参阅“EntityValidationErrors”属性[重复]

    这个问题在这里已经有答案了 我在使用代码优先方法为数据库播种时遇到此错误 一个或多个实体的验证失败 有关更多详细信息 请参阅 EntityValidationErrors 属性 说实话我不知道如何检查验证错误的内容 Visual Studi