Самое простое решение - переопределить 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/
Мартин Девиллерс
источник
using System.Linq;
Как указал Мартин, здесь есть больше информации
DbEntityValidationResult
. Я нашел полезным получать как имя моего класса POCO, так и имя свойства в каждом сообщении, и хотел избежать необходимости писать собственныеErrorMessage
атрибуты во всех моих[Required]
тегах только для этого.Следующая настройка кода Мартина позаботилась об этих деталях для меня:
источник
SelectMany and Aggregate
в GitHub по Дерзкие КодерыЧтобы просмотреть
EntityValidationErrors
коллекцию, добавьте следующее выражение Watch в окно Watch.Я использую Visual Studio 2013
источник
Пока вы находитесь в режиме отладки внутри
catch {...}
блока, откройте окно «QuickWatch» ( ctrl+ alt+ q) и вставьте туда:Это позволит вам углубиться в
ValidationErrors
дерево. Я нашел самый простой способ получить мгновенное представление об этих ошибках.Для пользователей Visual 2012+, которые заботятся только о первой ошибке и могут не иметь
catch
блока, вы можете даже сделать:источник
Чтобы быстро найти значимое сообщение об ошибке, проверив ошибку во время отладки:
Добавьте быстрые часы для:
Разверните EntityValidationErrors как это:
(элемент коллекции, например, [0])> ValidationErrors> (элемент коллекции, например, [0])> ErrorMessage
источник
На самом деле, это проблема проверки, EF сначала проверит свойства объекта, прежде чем вносить какие-либо изменения в базу данных. Таким образом, EF проверит, находится ли значение свойства вне диапазона, как при создании таблицы. Table_Column_UserName - это varchar (20). Но в EF вы ввели значение, превышающее 20. Или, в других случаях, если столбец не позволяет быть пустым. Таким образом, в процессе проверки вы должны установить значение в ненулевой столбец, независимо от того, собираетесь ли вы вносить в него изменения. Мне лично нравится ответ Лениеля Макафери. Он может показать вам детали вопросов проверки
источник
Я думаю, что «фактические ошибки проверки» могут содержать конфиденциальную информацию, и это может быть причиной, по которой Microsoft решила поместить их в другое место (свойства). Решение, отмеченное здесь, является практичным, но его следует принимать с осторожностью.
Я бы предпочел создать метод расширения. Больше причин для этого:
источник
Для функций Azure мы используем это простое расширение для Microsoft.Extensions.Logging.ILogger
и пример использования:
источник
Используйте Try Block в вашем коде, как
Вы можете проверить детали и здесь
http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/
Проверка не удалась для одного или нескольких объектов. См. Свойство EntityValidationErrors для более подробной информации.
http://blogs.infosupport.com/improving-dbentityvalidationexception/
источник