【问题标题】:Validation failed for one or more entities. See 'EntityValidationErrors' property for more details [duplicate]一个或多个实体的验证失败。有关更多详细信息,请参阅“EntityValidationErrors”属性[重复]
【发布时间】:2011-12-09 08:47:18
【问题描述】:

使用代码优先方法为我的数据库播种时出现此错误。

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

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

这适用于我以前的模型,但我做了一些更改,如下所述:

  • 我有一个名为 Status 的枚举,我将其更改为一个名为 Status 的类
  • 我将类 ApplysPositionHistory 更改为对同一个表有 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
        }
    }
}

【问题讨论】:

    标签: c# entity-framework entity-framework-4 entity-framework-4.1


    【解决方案1】:

    说实话,我不知道如何检查验证错误的内容。 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 是属性级别的错误列表。

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

    编辑

    一些细微的改进:

    违规属性的可以像这样包含在内部循环中:

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

    对于正在生产中并使用 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 中。

    • 1234563 (见下面的 cmets)。

    【讨论】:

    • 钻入异常没有任何作用。它只是说有一个 DbEntityValidationResult 但不允许你扩展!!
    • @Shumii 请参阅this answer 以展开异常。
    • 只是为了扩展一个优雅的解决方案。您可能希望在自己的 DbContext 类中重写 savechanges 方法,然后添加 try catch 块,其中 try 块只是尝试保存 (base.SaveChanges()),而 catch 块仅捕获 DbEntityValidationException。这样,您无需在保存更改的每个地方都添加它。
    • 这不止一次救了我的培根。我只能投票一次。希望他们每次我复制和粘贴此内容时都能让我投票。
    • +2 代码。确实是救世主:) -1 使用 Console.WriteLine,我估计现在更多的人正在编写 Web 项目,然后是控制台应用程序,而 Debug.Write 在两者中都可以使用......
    【解决方案2】:

    请注意,Entity.GetType().BaseType.Name 给出了您指定的类型名称,而不是名称中包含所有十六进制数字的名称。

    【讨论】:

      【解决方案3】:

      在 try catch 中捕获异常,然后快速查看或 ctrl+d & ctrl+q,您可以深入到 EntityValidationErrors。

      【讨论】:

        【解决方案4】:

        对于在VB.NET工作的任何人

        Try
        Catch ex As DbEntityValidationException
            For Each a In ex.EntityValidationErrors
                For Each b In a.ValidationErrors
                    Dim st1 As String = b.PropertyName
                    Dim st2 As String = b.ErrorMessage
                Next
            Next
        End Try
        

        【讨论】:

          【解决方案5】:

          根据@Slauma 的回答和@Milton 的建议,我已经使用 try/catch 扩展了我们基类的自定义保存方法,该方法将处理(并因此登录我们的错误日志!)这些类型的异常。

          // Where `BaseDB` is your Entities object... (it could be `this` in a different design)
          public void Save(bool? validateEntities = null)
          {
              try
              {
                  //Capture and set the validation state if we decide to
                  bool validateOnSaveEnabledStartState = BaseDB.Configuration.ValidateOnSaveEnabled;
                  if (validateEntities.HasValue)
                      BaseDB.Configuration.ValidateOnSaveEnabled = validateEntities.Value;
          
                  BaseDB.SaveChanges();
          
                  //Revert the validation state when done
                  if (validateEntities.HasValue)
                      BaseDB.Configuration.ValidateOnSaveEnabled = validateOnSaveEnabledStartState;
              }
              catch (DbEntityValidationException e)
              {
                  StringBuilder sb = new StringBuilder();
                  foreach (var eve in e.EntityValidationErrors)
                  {
                      sb.AppendLine(string.Format("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)
                      {
                          sb.AppendLine(string.Format("- Property: \"{0}\", Error: \"{1}\"",
                                                      ve.PropertyName,
                                                      ve.ErrorMessage));
                      }
                  }
                  throw new DbEntityValidationException(sb.ToString(), e);
              }
          }
          

          【讨论】:

          • 可以直接使用sb.AppendFormat()
          • 如果您使用 AppendFormat,您还需要添加自己的换行符。
          【解决方案6】:

          其实不用写代码就可以做到:

          在您的 catch 块中,在以下代码行添加一个断点:

          catch (Exception exception)
          {
          
          }
          

          现在,如果您将鼠标悬停在exception 上或将其添加到Watch,然后导航到异常详细信息,如下所示;您将看到哪些特定列是/正在导致问题,因为此错误通常发生在违反表约束时..

          Large image

          【讨论】:

          • 这种方法非常简单,并且利用了 IDE :)
          • 这是一个很好的解决方案,因为它快速、简单、利用了 IDE,并且为我节省了大量时间。
          • 我喜欢这种方式“如何成为程序员而不是做代码”
          • 谢谢。这很简单,但使用 IDE 查看异常非常棒。
          • 完美解决方案
          【解决方案7】:

          如果您只是捕获一个通用异常,将其转换为 DbEntityValidationException 可能会对您有所帮助。这种类型的异常有一个 Validation Errors 属性,继续扩展你的方法,你会发现所有的问题。

          例如,如果你在 catch 中设置了一个断点,你可以将以下内容扔到 watch 中:

          ((System.Data.Entity.Validation.DbEntityValidationException ) ex)
          

          错误的一个例子是如果一个字段不允许空值,并且你有一个空字符串,你会看到它说该字段是必需的。

          【讨论】:

            【解决方案8】:

            您可以在调试期间从 Visual Studio 中执行此操作,而无需编写任何代码,甚至无需编写 catch 块。

            只需添加一个带有名称的手表:

            ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
            

            监视表达式$exception 显示在当前上下文中抛出的任何异常,即使它没有被捕获并分配给变量。

            基于http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/

            【讨论】:

            • +1 更好的解决方案,并且不需要更改代码。酷
            • +1 这非常非常方便!你甚至不需要 try/catch 块。当 VS 中断并瞧瞧时,只需将其粘贴在监视列表中即可。您面前有验证错误。
            • 一年几次我忘记了如何做到这一点并找到这个答案
            • @zairja 我没有在 vb.net 中对其进行测试,但似乎在msdn.microsoft.com/en-us/library/ms164891.aspx 中也为 vb.net 定义了该变量,但是可能没有为 vb 定义演员表。 net,而你应该做 DirectCast ($exception,System.Data.Entity.Validation.DbEntityValidationException)
            • 我知道在 cmets 中不欢迎“谢谢”,但为了防止我浪费时间......谢谢!
            【解决方案9】:

            使用@Slauma 的答案,我制作了一个代码 sn-p(带有 sn-p 的环绕)以便更好地使用。

            <?xml version="1.0" encoding="utf-8"?>
            <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
              <CodeSnippet Format="1.0.0">
                <Header>
                  <SnippetTypes>
                    <SnippetType>SurroundsWith</SnippetType>
                  </SnippetTypes>
                  <Title>ValidationErrorsTryCatch</Title>
                  <Author>Phoenix</Author>
                  <Description>
                  </Description>
                  <HelpUrl>
                  </HelpUrl>
                  <Shortcut>
                  </Shortcut>
                </Header>
                <Snippet>
                  <Code Language="csharp"><![CDATA[try
            {
                $selected$ $end$
            }
            catch (System.Data.Entity.Validation.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;
            }]]></Code>
                </Snippet>
              </CodeSnippet>
            </CodeSnippets>
            

            【讨论】:

              【解决方案10】:

              当您在catch {...} 块内处于调试模式时,打开“QuickWatch”窗口(ctrl+alt+q)并粘贴到那里:

              ((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors

              或:

              ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors

              如果您不在 try/catch 中或无权访问异常对象。

              这将允许您深入了解ValidationErrors 树。这是我发现即时了解这些错误的最简单方法。

              【讨论】:

                【解决方案11】:

                要快速查看第一个错误,甚至无需添加手表,您可以将其粘贴到即时窗口中:

                ((System.Data.Entity.Validation.DbEntityValidationException)$exception)
                    .EntityValidationErrors.First()
                    .ValidationErrors.First()
                

                【讨论】:

                • 您也可以使用 $exception.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage) 来获取所有这些 :) 恕我直言,使用即时窗口是最佳答案
                【解决方案12】:

                只需检查您的数据库表字段长度。 您的输入文本大于列字段数据类型长度的长度

                【讨论】:

                  【解决方案13】:

                  我必须在即时窗口中写下这个:3

                  (((exception as System.Data.Entity.Validation.DbEntityValidationException).EntityValidationErrors as System.Collections.Generic.List<System.Data.Entity.Validation.DbEntityValidationResult>)[0].ValidationErrors as System.Collections.Generic.List<System.Data.Entity.Validation.DbValidationError>)[0]
                  

                  为了深入了解确切的错误!

                  【讨论】:

                    【解决方案14】:

                    @Slauma 的答案非常棒,但我发现当 ComplexType 属性无效时它不起作用。

                    例如,假设您有一个复杂类型PhoneNumber 的属性Phone。如果AreaCode 属性无效,则ve.PropertyNames 中的属性名称为“Phone.AreaCode”。这会导致对eve.Entry.CurrentValues&lt;object&gt;(ve.PropertyName) 的调用失败。

                    要解决此问题,您可以在每个 . 处拆分属性名称,然后递归遍历生成的属性名称数组。最后,当你到达链的底部时,你可以简单地返回属性的值。

                    下面是 @Slauma 的 FormattedDbEntityValidationException 类,支持 ComplexTypes。

                    享受吧!

                    [Serializable]
                    public class FormattedDbEntityValidationException : Exception
                    {
                        public FormattedDbEntityValidationException(DbEntityValidationException innerException) :
                            base(null, innerException)
                        {
                        }
                    
                        public override string Message
                        {
                            get
                            {
                                var innerException = InnerException as DbEntityValidationException;
                                if (innerException == null) return base.Message;
                    
                                var 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)
                                    {
                                        object value;
                                        if (ve.PropertyName.Contains("."))
                                        {
                                            var propertyChain = ve.PropertyName.Split('.');
                                            var complexProperty = eve.Entry.CurrentValues.GetValue<DbPropertyValues>(propertyChain.First());
                                            value = GetComplexPropertyValue(complexProperty, propertyChain.Skip(1).ToArray());
                                        }
                                        else
                                        {
                                            value = eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName);
                                        }
                                        sb.AppendLine(string.Format("-- Property: \"{0}\", Value: \"{1}\", Error: \"{2}\"",
                                            ve.PropertyName,
                                            value,
                                            ve.ErrorMessage));
                                    }
                                }
                                sb.AppendLine();
                    
                                return sb.ToString();
                            }
                        }
                    
                        private static object GetComplexPropertyValue(DbPropertyValues propertyValues, string[] propertyChain)
                        {
                            var propertyName = propertyChain.First();
                            return propertyChain.Count() == 1 
                                ? propertyValues[propertyName] 
                                : GetComplexPropertyValue((DbPropertyValues)propertyValues[propertyName], propertyChain.Skip(1).ToArray());
                        }
                    }
                    

                    【讨论】:

                    • 我不敢相信没有更多人支持这个,因为这是一个非常真实的场景,过去两晚让我发疯。您知道当您意识到错误处理实际上是引发错误时的感觉吗?呃。
                    【解决方案15】:

                    在调试中,您可以在 QuickWatch 表达式评估器输入字段中输入:

                    context.GetValidationErrors()
                    

                    【讨论】:

                      【解决方案16】:

                      这对我有用。

                      var modelState = ModelState.Values;
                      if (!ModelState.IsValid)
                      {
                          return RedirectToAction("Index", "Home", model);
                      }
                      

                      在 if 语句上设置断点。 然后您可以在调试窗口中检查 modelState。在每个值上,您都可以查看是否存在错误,甚至是错误消息。而已。 当您不再需要它时,只需删除或注释该行即可。

                      我希望这会有所帮助。

                      如果被问到,我可以在调试窗口中提供详细的屏幕截图。

                      【讨论】:

                        【解决方案17】:

                        正如其他帖子中提到的,只需在 DbEntityValidationException 类中捕获异常即可。 这将在错误情况下为您提供所需的水。

                         try
                         {
                          ....
                         }
                         catch(DbEntityValidationException ex)
                         {
                          ....
                         }
                        

                        【讨论】:

                          【解决方案18】:

                          我之前遇到过这个错误

                          当我尝试update specific field in my model in entity framwork

                          Letter letter = new Letter {ID = letterId, ExportNumber = letterExportNumber,EntityState = EntityState.Modified};
                          LetterService.ChangeExportNumberfor(letter);
                          //----------
                          
                          
                          public int ChangeExportNumber(Letter letter)
                              {
                                  int result = 0;
                                  using (var db = ((LettersGeneratorEntities) GetContext()))
                                  {
                                      db.Letters.Attach(letter);
                                      db.Entry(letter).Property(x => x.ExportNumber).IsModified = true;
                                      result += db.SaveChanges();
                                  }
                                  return result;
                              }
                          

                          根据以上答案

                          我找到了验证消息The SignerName field is required.

                          指向我模型中的字段

                          当我检查我的数据库架构时,我发现了

                          所以不正常ValidationException有权利提高

                          根据这个字段我希望它可以为空,(我不知道我是怎么搞砸的)

                          所以我更改了该字段以允许 Null,这样我的代码就不会再给我这个错误了

                          所以如果您使数据库的数据完整性无效,则可能会发生此错误

                          【讨论】:

                          • 是否应该引发异常并不是这里的重点。接下来,你在这里偷工减料。当数据库架构中需要一个字段时,您需要的不仅仅是DbEntityValidationException
                          【解决方案19】:

                          以下是在 Visual Studio 中检查 EntityValidationErrors 内容的方法(无需编写任何额外代码),即在 IDE 中的调试期间.

                          问题?

                          您是对的,Visual Studio 调试器的 查看详细信息 弹出窗口没有显示 EntityValidationErrors 集合中的实际错误。

                          解决方案!

                          只需在 Quick Watch 窗口中添加以下表达式,然后点击 Reevaluate

                          ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors

                          在我的例子中,看看我如何能够扩展到EntityValidationErrors 集合中的ValidationErrors List

                          参考资料: mattrandle.me blog post, @yoel's answer

                          【讨论】:

                          • 为什么这个问题还没有解决?它应该显示错误而不是其他内容
                          • 验证错误显示属性错误,例如。主题字段是必填项,很好的答案,谢谢
                          • 太棒了!它拯救了我的夜晚! :)
                          • 这是可视化手表中确切错误的聪明方法...谢谢!
                          【解决方案20】:

                          只要投入我的两分钱......

                          在我的 dbConfiguration.cs 中,我喜欢将我的 context.SaveChanges() 方法包装到 try/catch 中,并生成一个输出文本文件,让我可以清楚地读取错误,并且此代码还为它们加上时间戳 -如果您在不同的时间遇到​​多个错误,这很方便!

                                  try
                                  {
                                      context.SaveChanges();
                                  }
                                  catch (DbEntityValidationException e)
                                  {
                                      //Create empty list to capture Validation error(s)
                                      var outputLines = new List<string>();
                          
                                      foreach (var eve in e.EntityValidationErrors)
                                      {
                                          outputLines.Add(
                                              $"{DateTime.Now}: Entity of type \"{eve.Entry.Entity.GetType().Name}\" in state \"{eve.Entry.State}\" has the following validation errors:");
                                          outputLines.AddRange(eve.ValidationErrors.Select(ve =>
                                              $"- Property: \"{ve.PropertyName}\", Error: \"{ve.ErrorMessage}\""));
                                      }
                                      //Write to external file
                                      File.AppendAllLines(@"c:\temp\dbErrors.txt", outputLines);
                                      throw;
                                  }
                          

                          【讨论】:

                            【解决方案21】:

                            我发现...当我收到“EntityValidationErrors”错误时...我的数据库“db1”中有一个字段在表“tbladdress”中为“address1”,其大小为 100(即地址 varchar (100) null) 并且我传递的值超过 100 个字符..这导致在将数据保存到数据库时出错....

                            所以你必须检查你传递给字段的数据。

                            【讨论】:

                            • 我很欣赏这个答案,因为它实际上帮助我解决了我的错误。我保存在数据库中的表包含所有 not null 列,因此一旦我将数据添加到 db.SaveChanges() 之前的所有元素中,我就没有收到任何错误。
                            【解决方案22】:

                            请检查您传递的字段值,是否有效并根据数据库字段。例如,特定字段中传递的字符数少于数据库表字段中定义的字符数。

                            【讨论】:

                              【解决方案23】:

                              检查您的表列中是否有Not Null 约束,并且在插入/更新操作时您没有传递该列的值。 这会导致实体框架中出现此异常。

                              【讨论】:

                                【解决方案24】:

                                如果您将 IISWindows 身份验证Entity Framework 一起使用,请小心使用 authorize

                                我在未经授权的情况下尝试POST,但没有成功,并在db.SaveChangesAsync(); 上出现此错误,而所有其他动词GETDELETE 都在工作。

                                但是当我添加 AuthorizeAttribute 作为注释时,它起作用了。

                                [Authorize]
                                public async Task<IHttpActionResult> Post(...){
                                ....
                                }
                                

                                【讨论】:

                                  【解决方案25】:

                                  这是另一种方法,而不是使用 foreach 循环来查看 EntityValidationErrors。当然,您可以根据自己的喜好格式化消息:

                                  try {
                                          // your code goes here...
                                      } 
                                  catch (DbEntityValidationException ex) 
                                      {
                                          Console.Write($"Validation errors: {string.Join(Environment.NewLine, ex.EntityValidationErrors.SelectMany(vr => vr.ValidationErrors.Select(err => $"{err.PropertyName} - {err.ErrorMessage}")))}", ex);
                                          throw;
                                      }
                                  

                                  【讨论】:

                                    【解决方案26】:

                                    我也遇到了同样的问题。在异常消失之后,我从数据库中更新了我的 .edmx。

                                    【讨论】:

                                      【解决方案27】:

                                      这个错误的发生主要是因为字段大小。 检查数据库表中的所有字段大小。

                                      【讨论】:

                                        【解决方案28】:

                                        在我的情况下,这是因为数据库字段的长度小于输入字段的长度。

                                        数据库表

                                        create table user(
                                          Username nvarchar(5) not  null
                                        );
                                        

                                        我的意见

                                        User newUser = new User()
                                        {
                                           Username = "123456"
                                        };
                                        

                                        Usernamelength 的值为 5,即lessthan 6

                                        ...这可能对某人有帮助

                                        【讨论】:

                                          【解决方案29】:

                                          也在为这个错误而苦苦挣扎,根据这里的主题,this answer 能够找出 sn-p 来复制/粘贴,而无需弄清楚必须导入什么(非常适合 C# 初学者),代码下面:

                                          try
                                          {
                                            context.SaveChanges();
                                          }
                                          catch (System.Data.Entity.Validation.DbEntityValidationException ex)
                                          {
                                            foreach (var entityValidationErrors in ex.EntityValidationErrors)
                                            {
                                              foreach (var validationError in entityValidationErrors.ValidationErrors)
                                              {
                                                System.Diagnostics.Debug.WriteLine("Property: " + validationError.PropertyName + " Error: " + validationError.ErrorMessage);
                                              }
                                            }
                                          }
                                          

                                          【讨论】:

                                            猜你喜欢
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 2019-03-20
                                            • 1970-01-01
                                            • 2021-05-25
                                            • 2018-01-10
                                            • 2013-05-13
                                            • 2014-02-24
                                            • 1970-01-01
                                            相关资源
                                            最近更新 更多