Язык программирования C#9 и платформа .NET5
modelBuilder.Entity<Car>(entity =>{<b> entity.HasQueryFilter(c => c.IsDrivable);</b><b> entity.Property(p</b><b> => p.IsDrivable).HasField("_isDrivable").HasDefaultValue(true);</b>entity.HasOne(d => d.Make<b>Navigation</b>).WithMany(p => p.<b>Cars</b>).HasForeignKey(d => d.MakeId).OnDelete(DeleteBehavior.ClientSetNull).HasConstraintName("FK_Make_Inventory");});Специальные исключения
Распространенный прием для обработки исключений предусматривает перехват системного исключения (и/или исключения EF Core, как в текущем примере), его регистрацию в журнале и генерацию специального исключения. Если специальное исключение перехватывается вышерасположенным методом, то разработчику известно, что исключение уже было зарегистрировано в журнале, и необходимо только отреагировать на него надлежащим образом в коде.
Создайте в проекте
новый каталог по имениAutoLot.Dalи поместите в него четыре новых файла классов,Exceptions,CustomException.cs,CustomConcurrencyException.csиCustomDbUpdateException.cs, содержимое которых показано ниже:CustomRetryLimitExceededException.cs// CustomException.csusing System;namespace AutoLot.Dal.Exceptions{public class CustomException : Exception{public CustomException() {}public CustomException(string message) : base(message) { }public CustomException(string message, Exception innerException): base(message, innerException) { }}}// CustomConcurrencyException.csusing 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.csusing 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.csusing 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){// Произошла ошибка параллелизма.// Подлежит регистрации в журнале и надлежащей обработке.