public CustomDbUpdateException(string message) : base(message) { }
public CustomDbUpdateException(
string message, DbUpdateException innerException)
: base(message, innerException) { }
}
}
// CustomRetryLimitExceededException.cs
using System;
using Microsoft.EntityFrameworkCore.Storage;
namespace AutoLot.Dal.Exceptions
{
public class CustomRetryLimitExceededException : CustomException
{
public CustomRetryLimitExceededException() { }
public CustomRetryLimitExceededException(string message)
: base(message) { }
public CustomRetryLimitExceededException(
string message, RetryLimitExceededException innerException)
: base(message, innerException) { }
}
}
На заметку! Обработка специальных исключений была подробно раскрыта в главе 7.
Переопределение метода SaveChanges()
Как обсуждалось в предыдущей главе, метод SaveChanges()
базового класса DbContext
сохраняет результаты операций изменения, добавления и удаления в базе данных. Переопределение этого метода позволяет инкапсулировать обработку исключений в одном месте. Располагая специальными исключениями, добавьте оператор using
для AutoLot.Dal.Exceptions
в начало файла ApplicationDbContext.cs
, после чего переопределите метод SaveChanges()
:
public override int SaveChanges()
{
try
{
return base.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
// Произошла ошибка параллелизма.
// Подлежит регистрации в журнале и надлежащей обработке.
throw new CustomConcurrencyException(
"A concurrency error happened.", ex);
// Произошла ошибка параллелизма
}
catch (RetryLimitExceededException ex)
{
// Подлежит регистрации в журнале и надлежащей обработке.
throw new CustomRetryLimitExceededException(
"There is a problem with SQl Server.", ex);
// Возникла проблема c SQL Server
}
catch (DbUpdateException ex)
{
// Подлежит регистрации в журнале и надлежащей обработке.
throw new CustomDbUpdateException(
"An error occurred updating the database", ex);
// Произошла ошибка при обновлении базы данных
}
catch (Exception ex)
{
// Подлежит регистрации в журнале и надлежащей обработке.
throw new CustomException(
"An error occurred updating the database", ex);
// Произошла ошибка при обновлении базы данных
}
}
Обработка событий DbContext и ChangeTracker
Перейдите к конструктору класса ApplicationDbContext
и добавьте три события DbContext
, которые обсуждались в предыдущей главе:
public ApplicationDbContext(DbContextOptions
: base(options)
{
base.SavingChanges += (sender, args) =>
{
Console.WriteLine($"Saving changes for {((ApplicationDbContext)
sender)!.Database!.
GetConnectionString()}");
};
base.SavedChanges += (sender, args) =>
{
Console.WriteLine($"Saved {args!.EntitiesSavedCount} changes for
{((ApplicationDbContext)sender)!.Database!.GetConnectionString()}");
};
base.SaveChangesFailed += (sender, args) =>
{
Console.WriteLine(