public virtual int Add(T entity, bool persist = true)
{
Table.Add(entity);
return persist ? SaveChanges() : 0;
}
public virtual int AddRange(IEnumerable<T> entities, bool persist = true)
{
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<T> entities, bool persist = true)
{
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<T> entities, bool persist = true)
{
Table.RemoveRange(entities);
return persist ? SaveChanges() : 0;
}
Есть еще один метод удаления, который не следует этому шаблону. Для выдачи операции удаления он использует
EntityState
, что часто происходит при работе с ASP.NET Core с целью сокращения сетевого трафика:
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<T>
, и интерфейс, который реализует
IRepo<T>
. Создайте в каталоге
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;
Измените интерфейс на
public
и реализуйте
IRepo<Car>
, как показано ниже:
namespace AutoLot.Dal.Repos.Interfaces
{
public interface ICarRepo : IRepo<Car>
{
IEnumerable<Car> GetAllBy(int makeId);
string GetPetName(int id);
}
}
Интерфейс хранилища данных о кредитных рисках
Откройте файл
ICreditRiskRepo.cs
. Интерфейс
ICreditRiskRep
не добавляет никакой функциональности сверх той, что предоставляется в
BaseRepo
. Обновите код следующим образом:
using AutoLot.Models.Entities;
using AutoLot.Dal.Repos.Base;
namespace AutoLot.Dal.Repos.Interfaces
{
public interface ICreditRiskRepo : IRepo<CreditRisk>
{
}
}
Интерфейс хранилища данных о заказчиках
Откройте файл
ICustomerRepo.cs
. Интерфейс
ICustomerRepo
не добавляет никакой функциональности сверх той, что предоставляется в
BaseRepo
. Приведите код к такому виду:
using AutoLot.Models.Entities;
using AutoLot.Dal.Repos.Base;
namespace AutoLot.Dal.Repos.Interfaces
{
public interface ICustomerRepo : IRepo<Customer>
{
}
}
Интерфейс хранилища данных о производителях
Откройте файл
IMakeRepo.cs
. Интерфейс
IMakeRepo
не добавляет никакой функциональности сверх той, что предоставляется в
BaseRepo
. Обновите код, как показано ниже: