Не удалось выполнить проверку для одного или нескольких объектов. Дополнительную информацию см. В разделе "Свойство 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
}
}
}
Ответы
Ответ 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 за его примечание в комментариях ниже).
Для веб-приложений, которые находятся в производстве и которые используют 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;
останова на строке, throw newException;
Вы можете просто проверить свойство newException.Message
в виде текста, вместо того, чтобы newException.Message
в newException.Message
что немного неудобно и, кажется, не работает легко для всех (см. комментарии ниже).
Ответ 2
Вы можете сделать это из Visual Studio во время отладки без написания кода, даже блока catch.
Просто добавьте часы с именем:
((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
Выражение наблюдения $exception
отображает любое исключение, выданное в текущем контексте, даже если оно не было перехвачено и присвоено переменной.
Основано на http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/
Ответ 3
Это может сделать это без необходимости писать код:
В вашем блоке catch добавьте точку прерывания в следующую строку кода:
catch (Exception exception)
{
}
Теперь, если вы наведите курсор на exception
или добавьте его в Watch
, а затем перейдите к деталям исключений, как показано ниже; вы увидите, какой именно столбец является/вызывает проблему, поскольку эта ошибка обычно возникает, когда нарушается ограничение таблицы.
![enter image description here]()
Большое изображение
Ответ 4
Здесь вы можете проверить содержимое EntityValidationErrors в Visual Studio (без написания дополнительного кода), то есть во время Отладки в IDE.
Проблема?
Вы правы, отладчик Visual Studio Просмотреть детали Всплывающее окно не отображает фактические ошибки внутри коллекции EntityValidationErrors
.
![введите описание изображения здесь]()
Решение!
Просто добавьте следующее выражение в окно Быстрое наблюдение и нажмите Переоценить.
((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
В моем случае посмотрим, как я могу расшириться в ValidationErrors
List
внутри коллекции EntityValidationErrors
![введите описание изображения здесь]()
Ссылки: сообщение в блоге mattrandle.me, @yoel answer
Ответ 5
Чтобы быстро увидеть первую ошибку, даже не добавляя часы, вы можете вставить ее в окно "Немедленное":
((System.Data.Entity.Validation.DbEntityValidationException)$exception)
.EntityValidationErrors.First()
.ValidationErrors.First()
Ответ 6
Для тех, кто работает в 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
Ответ 7
Пока вы находитесь в режиме отладки в блоке catch {...}
, откройте окно QuickWatch (ctrl + alt + q) и вставьте туда:
((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors
или
((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
Если вы не находитесь в try/catch или не имеете доступа к объекту исключения.
Это позволит вам развернуться в дерево ValidationErrors
. Это самый простой способ найти мгновенное понимание этих ошибок.
Ответ 8
Если вы просто ловите общее исключение, вам может пригодиться это как DbEntityValidationException. Этот тип исключения имеет свойство Validation Errors и продолжает расширять свой путь в них, вы найдете все проблемы.
Например, если вы поместите точку прерывания в catch, вы можете бросить следующее в часы:
((System.Data.Entity.Validation.DbEntityValidationException ) ex)
Примером ошибки является , если поле не допускает null, и у вас есть нулевая строка, вы увидите, что это поле требуется.
Ответ 9
В отладке вы можете ввести это в поле ввода оценщика выражения QuickWatch:
context.GetValidationErrors()
Ответ 10
просто проверьте длину поля таблицы базы данных.
Ваш входной текст больше длины длины поля данных поля столбца
Ответ 11
Мне нужно было написать это в окне Immediate: 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]
чтобы вдаваться в точную ошибку!
Ответ 12
Ответ от @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());
}
}
Ответ 13
Обратите внимание, что Entity.GetType().BaseType.Name
указывает имя типа, которое вы указали, а не имя со всеми шестнадцатеричными цифрами в имени.
Ответ 14
В ответ на @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);
}
}
Ответ 15
Используя ответ @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>
Ответ 16
Поймайте исключение в try catch, а затем быстрый просмотр или ctrl + d и ctrl + q, и вы можете перейти к EntityValidationErrors.
Ответ 17
Просто бросаю мои два цента в...
В моем 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;
}
Ответ 18
Что я нашел... когда я получил ошибку EntityValidationErrors, это то, что.... У меня есть поле в моей базе данных "db1" в таблице "tbladdress" как "address1", размер которого равен 100 (т.е. адрес varchar (100) null), и я передавал значение более 100 символов... и это приводит к ошибке при сохранении данных в базе данных....
Итак, вы должны проверить данные, которые вы передаете в поле.
Ответ 19
Это работает для меня.
var modelState = ModelState.Values;
if (!ModelState.IsValid)
{
return RedirectToAction("Index", "Home", model);
}
Поместите контрольную точку в оператор if.
Затем вы можете проверить modelState в окне отладки. На каждое значение вы можете увидеть, есть ли ошибка и даже сообщение об ошибке. Это.
Когда вам это больше не нужно, просто удалите или прокомментируйте строку.
Надеюсь, это поможет.
Если вас попросят, я могу предоставить подробный снимок экрана в окне отладки.
Ответ 20
Как упоминалось в других сообщениях, просто поймайте исключение в классе DbEntityValidationException.
Что даст вам все, что вам нужно во время ошибок.
try
{
....
}
catch(DbEntityValidationException ex)
{
....
}
Ответ 21
Я столкнулся с этой ошибкой до
когда я попытался обновить определенное поле в моей модели в инфраструктуре сущности
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.
указывающий на поле в моей модели
и когда я проверил мою схему базы данных, я обнаружил
![введите описание изображения здесь]()
so off coure ValidationException
имеет право поднять
и в соответствии с этим полем я хочу, чтобы он был нулевым (я не знаю, как я его испортил)
поэтому я изменил это поле, чтобы разрешить Null, и этим мой код снова не даст мне эту ошибку
Таким образом, эта ошибка может произойти, если вы аннулируете целостность данных своей базы данных
Ответ 22
Пожалуйста, проверьте значения полей, которые вы передаете, действительны и в соответствии с полями базы данных. Например, количество символов, переданных в определенном поле, меньше, чем символы, определенные в поле таблицы базы данных.
Ответ 23
Если вы используете IIS с Windows Authentification и Entity Framework, будьте осторожны, используя authorize
.
Я попытался POST
без авторизации, и это не сработало, и получил эту ошибку на db.SaveChangesAsync();
в то время как все остальные глаголы GET
и DELETE
работали.
Но когда я добавил AuthorizeAttribute в качестве аннотации, это сработало.
[Authorize]
public async Task<IHttpActionResult> Post(...){
....
}
Ответ 24
Проверьте, есть ли в столбцах таблицы ограничение Not Null
и не передается ли значение для этого столбца во время операций вставки/обновления. Это вызывает это исключение в рамках сущности.
Ответ 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"
};
length
Username
равна 5, что lessthan
6
... это может кому-то помочь
Ответ 29
سلام استاد خسته نباشید. ببخشید ی درخواستی خدمتتون داشتم میخواسم اگه امکانش هس و ی لطفی بهم بکنین ی کم تو درس زبان تخصصی بهم ارفاق کنین چون من ی کم با معدل 17 فاصله دارم و میخواستم الف بشم و ازتون چون استاد مشاورمون هستین کمک خواستم... اگه زحمت بکشین خیلی ممنون میش