我正在使用 Entity Framework 5.0 实现存储库模式 - 至少我认为我是 :)。这就是我正在使用的
public abstract class GenericRepository<C, T> :
IGenericRepository<T>
where T : class
where C : DbContext, new()
{
private bool disposed = false;
private C _entities = new C();
protected C Context
{
get { return _entities; }
set { _entities = value; }
}
public virtual IQueryable<T> GetAll()
{
IQueryable<T> query = _entities.Set<T>();
return query;
}
public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
{
IQueryable<T> query = _entities.Set<T>().Where(predicate);
return query;
}
public virtual void Add(T entity)
{
_entities.Set<T>().Add(entity);
}
public virtual void Delete(T entity)
{
_entities.Set<T>().Remove(entity);
}
public virtual void Edit(T entity)
{
_entities.Entry(entity).State = System.Data.EntityState.Modified;
}
public virtual bool Save()
{
return (_entities.SaveChanges() > 0);
}
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
if (disposing)
_entities.Dispose();
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
之后这个类被特定的存储库类继承 - 比如说 PlaceRepository
public class PlaceRepository : GenericRepository<DbEntities, Place>, IPlaceRepository
{ }
在另一层(业务层)中,我正在创建 PlaceRepository 类的实例 - 在名为 PlaceController 的类中。此类具有 PlaceEntity (CRUD) 的特定方法。在这个 PlaceController 中,我有一种方法用于在数据库中插入 Place 实体,但同时我在另一个表中插入一些东西(比如说 Country 表)。对于 Country 表上的 CRUD 操作,我有另一个名为 CountryRepository 的存储库。
综上所述,我在 Place Controller 中的方法创建了两个不同存储库的实例,以使用它们的方法,从而创建了两个不同的 DbContext 上下文。请参阅下面的代码
public class PlaceController
{
public bool InsertPlace(Place toInsert)
{
PlaceRepository _placeRepo = new PlaceRepository();
_placeRepo.Add(toInsert);
Country _country = new Country();
_country.Name = "default";
CountryRepository _countryRepo = new CountryRepository();
_countryRepo.Add(_country);
//now i must call save on bothRepositories
_countryRepo.Save(); _placeRepo.Save();
}
}
我需要对这种情况提出意见。创建上下文类的 2 个实例以进行两次插入是否很好?如果不是我应该考虑使用/实现另一种模式吗?