Самое простое решение - переопределить SaveChanges
класс сущностей. Вы можете поймать DbEntityValidationException
, распаковать фактические ошибки и создать новое DbEntityValidationException
с улучшенным сообщением.
- Создайте частичный класс рядом с вашим файлом SomethingSomething.Context.cs.
- Используйте код внизу этого поста.
- Вот и все. Ваша реализация будет автоматически использовать переопределенные SaveChanges без какой-либо работы по рефакторингу.
Ваше сообщение об исключении теперь будет выглядеть так:
System.Data.Entity.Validation.DbEntityValidationException: проверка не удалась для одного или нескольких объектов. См. Свойство EntityValidationErrors для более подробной информации. Ошибки валидации: поле PhoneNumber должно иметь тип строки или массива с максимальной длиной «12»; Поле LastName обязательно для заполнения.
Вы можете удалить переопределенные SaveChanges в любом классе, который наследует от DbContext
:
public partial class SomethingSomethingEntities
{
public override int SaveChanges()
{
try
{
return base.SaveChanges();
}
catch (DbEntityValidationException ex)
{
// Retrieve the error messages as a list of strings.
var errorMessages = ex.EntityValidationErrors
.SelectMany(x => x.ValidationErrors)
.Select(x => x.ErrorMessage);
// Join the list to a single string.
var fullErrorMessage = string.Join("; ", errorMessages);
// Combine the original exception message with the new one.
var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);
// Throw a new DbEntityValidationException with the improved exception message.
throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
}
}
}
DbEntityValidationException
Также содержит объекты , которые вызвали ошибки проверки. Поэтому, если вам требуется дополнительная информация, вы можете изменить приведенный выше код для вывода информации об этих объектах.
Смотрите также: http://devillers.nl/improving-dbentityvalidationexception/