TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #1395 1.77K
День 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)
{
// …
}
Гораздо чище, компактнее и намного более подходит для повторного использования.

Источник: https://dotnetcoretutorials.com/2022/01/29/better-exception-handling-with-entityframeworkcore-exceptions/
  • 👍 15
More from @netdeveloperdiary
  1. Oct 15, 2026Post #3374
  2. Oct 14, 2026Post #3373
  3. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  4. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
  5. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  6. Oct 10, 2026День 2810. #ЧтоНовенького #VSCode Более Быстрый и Лёгкий C# Dev Kit Мы, разработчики, люби…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →