У меня возникла эта ошибка при заполнении базы данных с использованием подхода «сначала код».
Проверка не удалась для одного или нескольких объектов. См. Свойство 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
}
}
}
источник
Console.WriteLine
, по моим оценкам, больше людей пишут веб-проекты, чем консольные приложения в настоящее время, иDebug.Write
работают в обоих ...Вы можете сделать это из Visual Studio во время отладки без написания кода, даже блока catch.
Просто добавьте часы с именем:
Выражение watch
$exception
отображает любое исключение, выданное в текущем контексте, даже если оно не было перехвачено и присвоено переменной.Основано на http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/
источник
Это действительно может сделать это без необходимости писать код:
В блоке catch добавьте точку останова в следующей строке кода:
Теперь, если вы наведите курсор мыши
exception
или добавите его в,Watch
а затем перейдите к деталям исключения, как показано ниже; вы увидите, какие столбцы (столбцы) вызывают / вызывают проблему, поскольку эта ошибка обычно возникает при нарушении ограничения таблицы.Большое изображение
источник
Вот как вы можете проверить содержимое EntityValidationErrors в Visual Studio (без написания дополнительного кода), т.е. во время отладки в IDE .
Проблема?
Вы правы, всплывающее окно View Details отладчика Visual Studio не отображает фактические ошибки внутри
EntityValidationErrors
коллекции.Решение!
Просто добавьте следующее выражение в окне Quick Watch и нажмите Reevaluate .
((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
В моем случае, посмотрите, как я могу расширить
ValidationErrors
List
внутрьEntityValidationErrors
коллекцииСсылки: mattrandle.me блоге , @ Йоэль Ответим
источник
Чтобы быстро увидеть первую ошибку, даже не добавив часы, вы можете вставить ее в «Немедленное окно»:
источник
Для тех, кто работает в
VB.NET
источник
Пока вы находитесь в режиме отладки внутри
catch {...}
блока, откройте окно «QuickWatch» ( ctrl+ alt+ q) и вставьте туда:((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors
или:
((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
Если вы не участвуете в программе try / catch или не имеете доступа к объекту исключения.
Это позволит вам углубиться в
ValidationErrors
дерево. Я нашел самый простой способ получить мгновенное представление об этих ошибках.источник
Если вы просто перехватываете общее исключение, вам может быть полезно преобразовать его в DbEntityValidationException . Этот тип исключения имеет свойство «Ошибки проверки», и, продолжая расширять свой путь к ним, вы найдете все проблемы.
Например, если вы поставили точку останова в улове, вы можете добавить в часы следующее:
Пример ошибки: если поле не допускает пустых значений, а у вас есть пустая строка, вы увидите, что это поле является обязательным.
источник
просто проверьте длину поля таблицы базы данных. Ваш входной текст больше, чем длина типа данных поля столбца
источник
В отладке вы можете ввести это в поле ввода оценщика выражений QuickWatch:
источник
Ответ @Slauma действительно хорош, но я обнаружил, что он не работал, когда свойство ComplexType было недействительным.
Например, скажем, у вас есть свойство
Phone
сложного типаPhoneNumber
. ЕслиAreaCode
свойство недопустимо, имя свойства вve.PropertyNames
это «Phone.AreaCode». Это приводит кeve.Entry.CurrentValues<object>(ve.PropertyName)
сбою вызова .Чтобы исправить это, вы можете разделить имя свойства на каждом
.
, а затем выполнить повторение по полученному массиву имен свойств. Наконец, когда вы достигаете нижней части цепочки, вы можете просто вернуть значение свойства.Ниже приведен
FormattedDbEntityValidationException
класс @ Slauma с поддержкой ComplexTypes.Наслаждайтесь!
источник
Обратите внимание, что здесь
Entity.GetType().BaseType.Name
указано имя типа, а не имя со всеми шестнадцатеричными цифрами в имени.источник
В ответе @ Slauma и предложении @ Milton я расширил пользовательский метод сохранения нашего базового класса с помощью метода try / catch, который будет обрабатывать (и, следовательно, регистрировать нашу регистрацию ошибок!) Подобные исключения.
источник
Я должен был написать это в Немедленном окне: 3
для того, чтобы углубиться в точную ошибку!
источник
Используя ответ @Slauma, я сделал фрагмент кода (окружение с фрагментом) для лучшего использования.
источник
Поймайте исключение в попытке перехвата, а затем быстро просмотрите или ctrl + d & ctrl + q, и вы можете перейти к EntityValidationErrors.
источник
Просто бросаю мои два цента в ...
В моем dbConfiguration.cs я хотел бы обернуть мой метод context.SaveChanges () в try / catch и создать выходной текстовый файл, который позволяет мне ясно читать ошибки (и), и этот код также помечает их метками времени - удобно, если вы столкнуться с более чем одной ошибкой в разное время!
источник
Что я нашел ... когда я получил ошибку EntityValidationErrors, это то, что .... у меня есть поле в моей базе данных 'db1' в таблице 'tbladdress' как 'address1', который имеет размер 100 (то есть address varchar (100) null) и я передавал значение более 100 символов .. и это приводило к ошибке при сохранении данных в базу данных ....
Поэтому вы должны проверить данные, которые вы передаете на поле.
источник
not null
столбцы, поэтому, как только я добавил данные ко всем элементам до моего,db.SaveChanges()
я не получил никакой ошибки.Это работает для меня.
Поставьте точку останова в операторе if. Затем вы можете проверить modelState в окнах отладки. По каждому значению вы можете увидеть, есть ли ошибка и даже сообщение об ошибке. Вот и все. Когда вам это больше не нужно, просто удалите или прокомментируйте строку.
Я надеюсь, это поможет.
Если потребуется, я могу предоставить подробный скриншот в окне отладки.
источник
Как упоминалось в других статьях, просто перехватывайте исключение в классе DbEntityValidationException. Что даст вам все, что вам требуется во время ошибок.
источник
Я сталкивался с этой ошибкой раньше
когда я пытался обновить конкретное поле в моей модели в рамке лица
и в соответствии с вышеуказанными ответами
Я нашел сообщение проверки
The SignerName field is required.
который указывает на поле в моей модели
и когда я проверил свою схему базы данных, я нашел
так не по себе
ValidationException
имеет право поднятьи в соответствии с этим полем я хочу, чтобы это было обнуляемым (я не знаю, как я это испортил)
поэтому я изменил это поле, чтобы разрешить Null, и в этом случае мой код не выдаст мне эту ошибку снова
источник
DbEntityValidationException
поднятия.Пожалуйста, проверьте значения полей, которые вы передаете, они действительны и соответствуют полям базы данных. Например, количество символов, переданных в определенном поле, меньше, чем символы, определенные в поле таблицы базы данных.
источник
Если вы используете IIS с Windows Authentification и Entity Framework , будьте осторожны в использовании
authorize
.Я пытался
POST
без разрешения, и это не сработало, и включил эту ошибкуdb.SaveChangesAsync();
, пока все остальные глаголыGET
иDELETE
работали.Но когда я добавил AuthorizeAttribute в качестве аннотации, это сработало.
источник
Вот еще один способ сделать это вместо использования циклов foreach для поиска внутри EntityValidationErrors. Конечно, вы можете отформатировать сообщение по своему вкусу:
источник
В моем случае это было из-за того, что длина поля базы данных меньше длины поля ввода.
таблица базы данных
Мой вклад
значение для
Username
length
является 5 , который являетсяlessthan
6... это может кому-то помочь
источник
Также боролся с этой ошибкой и основывался на теме здесь, и этот ответ смог выяснить фрагмент для копирования / вставки без необходимости выяснить, что должно быть импортировано (отлично для новичков в C #), код ниже:
источник
Проверьте, есть ли у вас
Not Null
ограничения в столбцах таблицы, и не передаете ли вы значение для этого столбца во время операций вставки / обновления. Это вызывает это исключение в рамках сущности.источник
Я тоже столкнулся с той же проблемой. Я обновил свой .edmx из базы данных после того, как исключение исчезло.
источник
Эта ошибка возникает в основном из-за размера поля. ПРОВЕРЬТЕ все размеры полей в таблице базы данных.
источник