我一直在学习MVC,我正在使用Entity Framework。我想要了解的是存储库。我读过的每个教程都涉及一个实体,在那个级别我有一个理解,但是多个表怎么样。我使用代码优先的变体,我将模型类与现有数据库相关联。在我的数据库中,有三个表;用户,旅程和用户旅程(链接表)。用户和旅程有多对多的关系。我应该为每个实体都有一个存储库吗?在这里汇总了什么用途?从长远来看,我想查询数据库以查找用户的旅程并传递给视图。
我的问题可能含糊不清,但我对这件事情感到很困惑,所以理解这一点的任何帮助都会受到赞赏!
答案 0 :(得分:1)
通常不应为每个实体定义存储库,而应为每个aggregate root
定义存储库。您拥有的实体不能独立生存,但与某些父实体相关。这个父实体被称为聚合根,你应该有一个存储库。
答案 1 :(得分:1)
搜索名为GenericRepository的概念。它将有助于摆脱每个实体问题的存储库。以下示例:
public interface IGenericRepository<T> where T : class
{
IEnumerable<T> GetAll();
T SingleOrDefault(Expression<Func<T, bool>> predicate);
IEnumerable<T> Get(Expression<Func<T, bool>> predicate);
void Insert(T entity);
void Update(T entity);
void Delete(object id);
void Delete(T entity);
}
public class GenericRepository<T> : IGenericRepository<T> where T : class
{
readonly MyDbContext _context;
readonly DbSet<T> _dbSet;
public GenericRepository(PfsDbContext context)
{
_context = context;
_dbSet = context.Set<T>();
}
public virtual IEnumerable<T> GetAll()
{
return _dbSet.AsEnumerable();
}
public T SingleOrDefault(Expression<Func<T, bool>> predicate)
{
return _dbSet.Where(predicate).SingleOrDefault();
}
public IEnumerable<T> Get(Expression<Func<T, bool>> predicate)
{
return _dbSet.Where(predicate);
}
public void Insert(T entity)
{
_dbSet.Add(entity);
}
public void Update(T entityToUpdate)
{
_dbSet.Attach(entityToUpdate);
_context.Entry(entityToUpdate).State = EntityState.Modified;
}
public void Delete(T entity)
{
if (_context.Entry(entity).State == EntityState.Detached)
{
_dbSet.Attach(entity);
}
_dbSet.Remove(entity);
}
public void Delete(object id)
{
var entityToDelete = _dbSet.Find(id);
Delete(entityToDelete);
}
}
然后您可以将其用作
var userRepository = new GenericRepository<User>(_context);
var journeyRepository = new GenericRepository<Journey>(_context);