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)
{
Table.Update(entity);
return persist ? SaveChanges : 0;
}
public virtual int UpdateRange(IEnumerable
{
Table.UpdateRange(entities);
return persist ? SaveChanges : 0;
}
public virtual int Delete(T entity, bool persist = true)
{
Table.Remove(entity);
return persist ? SaveChanges : 0;
}
public virtual int DeleteRange(IEnumerable
{
Table.RemoveRange(entities);
return persist ? SaveChanges : 0;
}
Есть еще один метод удаления, который не следует этому шаблону. Для выдачи операции удаления он использует EntityState
public int Delete(int id, byte[] timeStamp, bool persist = true)
{
var entity = new T {Id = id, TimeStamp = timeStamp};
Context.Entry(entity).State = EntityState.Deleted;
return persist ? SaveChanges : 0;
}
Итак, класс BaseRepo
Интерфейсы хранилищ, специфичных для сущностей
Каждая сущность будет иметь строго типизированное хранилище, производное от BaseRepo
IRepo. Создайте в каталоге Repos проекта AutoLot.Dal новый каталог по имени Interfaces и добавьте в него пять файлов интерфейсов:ICarRepo.cs
ICreditRiskRepo.cs
ICustomerRepo.cs
IMakelRepo.cs
IOrderRepo.cs
Содержимое интерфейсов будет представлено в последующих разделах.
Интерфейс хранилища данных об автомобилях
Откройте файл ICarRepo.cs
using:using System.Collections.Generic;
using AutoLot.Models.Entities;
using AutoLot.Dal.Repos.Base;
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT