Привет, глядя на шаблон репозитория, который обычно кажется реализованным примерно так:
public class GenericRepository<TEntity> where TEntity : class
{
// other business
public virtual TEntity GetByID(object id)
{
return db.Set().Find(id);
}
public virtual void Insert(TEntity entity)
{
db.Set().Add(entity);
}
public virtual void Delete(object id)
{
TEntity entityToDelete = db.Set().Find(id);
Delete(entityToDelete);
}
public virtual void Update(TEntity entityToUpdate)
{
db.Set().Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
}
Таким образом, для каждого типа, с которым вы хотите работать (например, для обновления), вам нужно создать экземпляр репозитория.
Итак, если бы у меня было два типа, я хотел бы сохранить Cars
и Trucks
, мне нужно было бы перейти:
var carRepository = new GernericRepository<Car>();
carRepository.Update(myCar);
var truckRepository = new GernericRepository<Truck>();
carRepository.Update(myTruck);
Итак, у вас есть отдельные репозитории для каждого типа. Чтобы сохранить все сразу, вам нужно unitOfWork
, чтобы все они использовали один и тот же контекст и сохраняли одновременно.
Конечно, не было бы лучше иметь что-то вроде:
public class GenericRepository
{
// other business
public virtual TEntity GetByID<TEntity>(object id) where TEntity : class
{
return db.Set<TEntity>().Find(id);
}
public virtual void Insert<TEntity>(TEntity entity) where TEntity : class
{
db.Set<TEntity>().Add(entity);
}
public virtual void Delete<TEntity>(object id) where TEntity : class
{
TEntity entityToDelete = db.Set<TEntity>().Find(id);
Delete(entityToDelete);
}
public virtual void Update<TEntity>(TEntity entityToUpdate) where TEntity : class
{
db.Set<TEntity>().Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
}
Это означает, что хранилище нужно создать только один раз и, следовательно, оно действительно является общим?
Таким образом, вы можете обновить свои автомобили и грузовики так:
var repository = new GernericRepository<Car>();
repository.Update<Car>(myCar);
rRepository.Update<Truck>(myTruck);
Конечно, это лучший метод? Я что-то пропустил? Он автоматически имеет только один контекст.