Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

public class CustomException : Exception

{

public CustomException {}

public CustomException(string message) : base(message) { }

public CustomException(string message, Exception innerException)

: base(message, innerException) { }

}

}

// CustomConcurrencyException.cs

using Microsoft.EntityFrameworkCore;

namespace AutoLot.Dal.Exceptions

{

public class CustomConcurrencyException : CustomException

{

public CustomConcurrencyException { }

public CustomConcurrencyException(string message) : base(message) { }

public CustomConcurrencyException(

string message, DbUpdateConcurrencyException innerException)

: base(message, innerException) { }

}

}

// CustomDbUpdateException.cs

using Microsoft.EntityFrameworkCore;

namespace AutoLot.Dal.Exceptions

{

public class CustomDbUpdateException : CustomException

{

public CustomDbUpdateException { }

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<ApplicationDbContext> options)

: base(options)

{

base.SavingChanges += (sender, args) =>

{

Console.WriteLine($"Saving changes for {((ApplicationDbContext)

sender)!.Database!.
GetConnectionString}");

Поделиться с друзьями: