it-swarm.com.ru

Проверка не удалась для одного или нескольких объектов. См. Свойство EntityValidationErrors для более подробной информации.

У меня возникла эта ошибка при заполнении базы данных с использованием подхода «сначала код».

Проверка не удалась для одного или нескольких объектов. См. Свойство EntityValidationErrors для более подробной информации.

Честно говоря, я не знаю, как проверить содержание ошибок проверки. Visual Studio показывает, что это массив с 8 объектами, поэтому 8 ошибок проверки.

Это работало с моей предыдущей моделью, но я внес несколько изменений, которые я объясню ниже:

  • У меня был enum с именем 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")]
        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
        }
    }
}
710
Luis Valencia

Честно говоря, я не знаю, как проверить содержание ошибок проверки. 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 за его примечание в комментариях ниже).

Для веб-приложений, которые находятся в производстве и которые используют 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;
        }
    }
}

И SaveChanges может быть перезаписан следующим образом:

public class MyContext : DbContext
{
    // ...

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

Несколько замечаний:

  • Желтый экран ошибок, который Elmah показывает в веб-интерфейсе или в отправленных электронных письмах (если вы это настроили), теперь отображает подробности проверки непосредственно в верхней части сообщения.

  • Перезапись свойства Message в пользовательском исключении вместо перезаписи ToString() имеет то преимущество, что стандартный ASP.NET «Желтый экран смерти (YSOD)» также отображает это сообщение. В отличие от Elmah, YSOD, очевидно, не использует ToString(), но оба отображают свойство Message.

  • Обтекание исходного DbEntityValidationException как внутреннего исключения гарантирует, что исходная трассировка стека все еще будет доступна и будет отображаться в Elmah и YSOD.

  • Установив точку останова в строке throw newException;, вы можете просто проверить свойство newException.Message в виде текста, а не углубляться в коллекции проверок, что немного неудобно и, похоже, не так легко работает для всех (см. Комментарии ниже).

1127
Slauma

Вы можете сделать это из Visual Studio во время отладки без написания кода, даже блока catch.

Просто добавьте часы с именем:

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

Выражение наблюдения $exception отображает любое исключение, выданное в текущем контексте, даже если оно не было перехвачено и присвоено переменной.

Основано на http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/

410
yoel halb

Это может сделать это без необходимости писать код: 

В блоке catch добавьте точку останова в следующей строке кода:

catch (Exception exception)
{

}

Теперь, если вы наведите курсор на exception или добавите его в Watch, а затем перейдите к деталям исключения, как показано ниже; вы увидите, какие столбцы (столбцы) вызывают/вызывают проблему, поскольку эта ошибка обычно возникает при нарушении ограничения таблицы.

enter image description here

Большое изображение

88
t_plusplus

Вот как вы можете проверить содержимое EntityValidationErrors в Visual Studio (без написания дополнительного кода), т. Е. Во время Debugging в IDE.

Эта проблема?

Вы правы, всплывающее окно View Details отладчика Visual Studio не отображает фактические ошибки в коллекции EntityValidationErrors

 enter image description here

Решение!

Просто добавьте следующее выражение в окно Quick Watch и нажмите Reevaluate.

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

В моем случае посмотрите, как я могу расшириться до ValidationErrorsList внутри коллекции EntityValidationErrors 

 enter image description here

Ссылки:mattrandle.me сообщение в блоге , @ ответ Йоэля

42
Shiva

Чтобы быстро увидеть первую ошибку, даже не добавив часы, вы можете вставить ее в «Немедленное окно»:

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

Для тех, кто работает в 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
14
nghiavt

Когда вы находитесь в режиме отладки в блоке catch {...}, откройте окно "QuickWatch" (ctrl+alt+q) и вставьте туда:

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

или:

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

Если вы не участвуете в программе try/catch или не имеете доступа к объекту исключения.

Это позволит вам углубиться в дерево ValidationErrors. Я нашел самый простой способ получить мгновенное представление об этих ошибках.

11
GONeale

Если вы просто перехватываете общее исключение, вам может быть полезно преобразовать его в DbEntityValidationException. Этот тип исключения имеет свойство «Ошибки проверки», и, продолжая расширять свой путь к ним, вы найдете все проблемы.

Например, если вы поместили точку останова в улов, вы можете бросить в часы следующее:

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

Примером ошибки является , если поле не допускает нулевые значения, и у вас есть пустая строка, вы увидите, что это поле является обязательным.

10
Greg

В отладке вы можете ввести это в поле ввода оценщика выражений QuickWatch:

context.GetValidationErrors()
9
silverfox1948

просто проверьте длину поля таблицы базы данных. Ваш входной текст больше, чем длина типа данных поля длины столбца

8
Hardeep Singh

Я должен был написать это в Немедленном окне: 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]

для того, чтобы углубиться в точную ошибку!

7
Nour Sabouny

В ответе @ 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);
    }
}
6
jocull

Ответ от @Slauma действительно хорош, но я обнаружил, что он не работал, когда свойство ComplexType было недействительным. 

Например, скажем, у вас есть свойство Phone сложного типа PhoneNumber. Если свойство AreaCode недопустимо, имя свойства в ve.PropertyNames будет «Phone.AreaCode». Это приводит к сбою вызова eve.Entry.CurrentValues<object>(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());
    }
}
6
mikesigs

Обратите внимание, что Entity.GetType().BaseType.Name дает указанное вами имя типа, а не имя со всеми шестнадцатеричными цифрами в имени.

6
Eric Nelson

Используя ответ @Slauma, я сделал фрагмент кода (окружение с фрагментом) для лучшего использования.

<?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>
6
Phoenix_uy

Поймать исключение в попытке поймать, а затем быстро просмотреть или ctrl + d & ctrl + q, и вы можете перейти к EntityValidationErrors.

5
Brandon.Staley

Что я нашел ... когда я получил ошибку EntityValidationErrors, это то, что .... у меня есть поле в моей базе данных 'db1' в таблице 'tbladdress' как 'address1', который имеет размер 100 (то есть address varchar (100) null) и я передавал значение более 100 символов .. и это приводило к ошибке при сохранении данных в базу данных ....

Поэтому вы должны проверить данные, которые вы передаете на поле.

4
Dharmendra Prajapati

Просто бросаю мои два цента в ...

В моем 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;
        }
4
IfElseTryCatch

Как упоминалось в других публикациях, просто поймайте исключение в классе DbEntityValidationException ., Которое даст вам все, что вам требуется во время ошибок.

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

Это работает для меня.

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

Поставьте точку останова в операторе if . Затем вы можете проверить modelState в окнах отладки. По каждому значению вы можете увидеть, есть ли ошибка и даже сообщение об ошибке. Вот и все .. Когда вам это больше не нужно, просто удалите или прокомментируйте строку.

Я надеюсь, это поможет.

Если потребуется, я могу предоставить подробный скриншот в окне отладки.

3
AngelDown

Я сталкивался с этой ошибкой раньше 

когда я пытался обновить конкретное поле в моей модели в рамке объекта

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.

который указывает на поле в моей модели 

и когда я проверил свою схему базы данных, я нашел 

 enter image description here

так что вне ValidationException имеет право поднять 

и в соответствии с этим полем я хочу, чтобы это было обнуляемым (я не знаю, как я это испортил)

поэтому я изменил это поле, чтобы разрешить Null, и в этом случае мой код не выдаст мне эту ошибку снова 

так что эта ошибка может произойти, если вы лишите законной силы целостность ваших данных 

2
Basheer AL-MOMANI

Пожалуйста, проверьте значения полей, которые вы передаете, действительны и в соответствии с полями базы данных. Например, количество символов, переданных в определенном поле, меньше, чем символы, определенные в поле таблицы базы данных.

2
arun tiwari

Если вы используетеIISс Аутентификация Windows и Entity Framework , будьте осторожны с использованием authorize.

Я попытался POST без авторизации, и это не сработало, и получил эту ошибку на db.SaveChangesAsync();, в то время как все остальные глаголы GET и DELETE работали.

Но когда я добавил AuthorizeAttribute в качестве аннотации, это сработало.

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

Проверьте, есть ли у вас ограничение Not Null в столбцах таблицы, и не передаете ли вы значение для этого столбца во время операций вставки/обновления .. Это вызывает это исключение в платформе сущностей.

0
s Jagathish

Я тоже столкнулся с той же проблемой. Я обновил свой .edmx из базы данных после того, как исключение исчезло. 

0
HariChintha

Вот еще один способ сделать это вместо использования циклов 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;
    }
0
Quantum_Joe

В моем случае это было из-за того, что длина поля базы данных меньше длины поля ввода.

таблица базы данных

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

Мой вклад

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

значение для Usernamelength равно 5 которое является lessthan 6

... это может кому-то помочь

0
Qwerty

Эта ошибка возникает главным образом из-за размера поля . ПРОВЕРЬТЕ все размеры полей в таблице базы данных.

0
Alexander Zaldostanov