Язык программирования C#9 и платформа .NET5
Часть 446 из 642 Информация о книге
}public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}private bool _isDisposed;protected virtual void Dispose(bool disposing){if (_isDisposed){return;}if (disposing){if (_disposeContext){Context.Dispose();}}_isDisposed = true;}~BaseRepo(){Dispose(false);}На свойства
классаDbSet<T>можно ссылаться с использованием методаApplicationDbContext. Создайте открытое свойство по имениContext.Set<T>()типаTableи установите его начальное значение в конструкторе:DbSet<T>public DbSet<T> Table { get; }protected BaseRepo(ApplicationDbContext context){Context = context;<b> Table = Context.Set<T>();</b>_disposeContext = false;}Реализация метода SaveChanges()
Класс
имеет методBaseRepo, который вызывает переопределенную версиюSaveChanges()и демонстрирует обработку специальных исключений. Добавьте в классSaveChanges()показанный ниже код:BaseRepopublic int SaveChanges(){try{return Context.SaveChanges();}catch (CustomException ex){// Подлежит надлежащей обработке -- уже зарегистрировано в журнале.throw;}catch (Exception ex){// Подлежит регистрации в журнале и надлежащей обработке.throw new CustomException("An error occurred updating the database", ex);}}Реализация общих методов чтения
Следующий комплект методов возвращает записи с применением операторов LINQ. Метод
принимает первичный ключ (ключи) и сначала выполняет поиск вFind(). Если сущность уже отслеживается, тогда возвращается отслеживаемый экземпляр, иначе запись извлекается из базы данных.ChangeTrackerpublic virtual T? Find(int? id) => Table.Find(id);Дополнительные два метода
расширяют базовый методFind(). Приведенный далее метод демонстрирует извлечение записи, но без ее добавления вFind(), используяChangeTracker. Добавьте в класс показанный ниже код:AsNoTrackingWithldentityResolution()public virtual T? FindAsNoTracking(int id) =>Table.AsNoTrackingWithIdentityResolution().FirstOrDefault(x => x.Id == id);Другая вариация удаляет из сущности фильтры запросов и затем применяет сокращенную версию (пропускающую метод
) для полученияWhere(). Добавьте в класс следующий код:FirstOrDefault()public T? FindIgnoreQueryFilters(int id) =>Table.IgnoreQueryFilters().FirstOrDefault(x => x.Id == id);Методы
возвращают все записи из таблицы. Первый метод извлекает их в порядке, поддерживаемом в базе данных, а второй по очереди обрабатывает все фильтры запросов:GetAll()public virtual IEnumerable<T> GetAll() => Table;public virtual IEnumerable<T> GetAllIgnoreQueryFilters()=> Table.IgnoreQueryFilters();Метод
предназначен для выполнения хранимых процедур:ExecuteQuery()public void ExecuteQuery(string sql, object[] sqlParametersObjects)=> Context.Database.ExecuteSqlRaw(sql, sqlParametersObjects);Реализация методов добавления, обновления и удаления
Далее понадобится добавить блок кода, который будет служить оболочкой для соответствующих методов добавления, обновления и удаления, связанных со специфичным свойством
. ПараметрDbSet<T>определяет, выполняет ли хранилище вызовpersistсразу же после вызова методов добавления, обновления и удаления. Все методы помечены какSaveChanges(), чтобы сделать возможным дальнейшее переопределение. Добавьте в класс показанный ниже код:virtual