return;
}
if (disposing)
{
if (_disposeContext)
{
Context.Dispose();
}
}
_isDisposed = true;
}
~BaseRepo()
{
Dispose(false);
}
На свойства DbSet
ApplicationDbContext можно ссылаться с использованием метода Context.Set() . Создайте открытое свойство по имени Table типа DbSet и установите его начальное значение в конструкторе:public DbSet
protected BaseRepo(ApplicationDbContext context)
{
Context = context;
Table = Context.Set
_disposeContext = false;
}
Реализация метода SaveChanges()
Класс BaseRepo
SaveChanges(), который вызывает переопределенную версию SaveChanges() и демонстрирует обработку специальных исключений. Добавьте в класс BaseRepo показанный ниже код:public 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()
ChangeTracker. Если сущность уже отслеживается, тогда возвращается отслеживаемый экземпляр, иначе запись извлекается из базы данных.public 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
public virtual IEnumerable
=> Table.IgnoreQueryFilters();
Метод ExecuteQuery()
public void ExecuteQuery(string sql, object[] sqlParametersObjects)
=> Context.Database.ExecuteSqlRaw(sql, sqlParametersObjects);
Реализация методов добавления, обновления и удаления
Далее понадобится добавить блок кода, который будет служить оболочкой для соответствующих методов добавления, обновления и удаления, связанных со специфичным свойством DbSet
persist определяет, выполняет ли хранилище вызов SaveChanges() сразу же после вызова методов добавления, обновления и удаления. Все методы помечены как virtual, чтобы сделать возможным дальнейшее переопределение. Добавьте в класс показанный ниже код:public virtual int Add(T entity, bool persist = true)
{
Table.Add(entity);
return persist ? SaveChanges() : 0;
}
public virtual int AddRange(IEnumerable
{
Table.AddRange(entities);
return persist ? SaveChanges() : 0;
}
public virtual int Update(T entity, bool persist = true)
{