Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин
День 1129. #ЗаметкиНаПолях
Улучшенная Обработка Исключений с EntityFrameworkCore.Exceptions
При выполнении практически любых действий с Entity Framework, включая обновления, удаления и вставку, если что-то пойдёт не так, вам выдаётся стандартное исключение:
Microsoft.EntityFrameworkCore.DbUpdateException: ‘An error occurred while saving the entity changes. See the inner exception for details.’ (Возникла ошибка при сохранении изменений сущности. См. детали во внутреннем исключении)
Это может очень раздражать, если вы хотите перехватить конкретное исключение базы данных (например, ожидаете, что могут быть дубликаты уникального ключа) и обработать их отдельно от, например, ошибки подключения. Давайте рассмотрим быстрый пример, чтобы проиллюстрировать, что я имею в виду.
Допустим, мы получили исключение с таким внутренним исключением:
SqlException: Cannot insert duplicate key row in object ‘…’ with unique index ‘…’. The duplicate key value is (…).
Если мы хотим обработать его отдельно, нам пришлось бы писать что-то вроде этого:
try
{
context.SaveChanges();
} catch(DbUpdateException e) when
(e?.InnerException?.
Message.Contains("Cannot insert duplicate key")
?? false)
{
// …
}
Очень некрасиво, и мало подходит для повторного использования. Если мы захотим использовать такую обработку ещё где-нибудь, нам придётся скопировать всю эту логику.
Использование EntityFrameworkCore.Exceptions
Библиотека EntityFrameworkCore.Exceptions чрезвычайно проста в использовании. Чтобы использовать её, всё, что нам нужно сделать, это установить соответствующий NuGet пакет:
Install-Package EntityFrameworkCore.Exceptions.SqlServer
Доступны также версии для Postgres, MySQL, Oracle и Sqlite.
Затем добавьте вот эту строку в настройки DB Context:
protected override void OnConfiguring(
DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseExceptionProcessor();
}
Теперь при том же исключении БД вместо стандартного DbUpdateException мы получим:
EntityFramework.Exceptions.Common.UniqueConstraintException: ‘Unique constraint violation’
Таким образом, можно заменить наш код try/catch на следующий:
try
{
context.SaveChanges();
} catch (UniqueConstraintException ex)
{
// …
}
Гораздо чище, компактнее и намного более подходит для повторного использования.
Источник: dotnetcoretutorials.com/2022/01…ceptions