我应该为每个实体定义一个存储库

时间:2013-07-10 12:48:19

标签: entity-framework asp.net-mvc-4 repository-pattern

我一直在学习MVC,我正在使用Entity Framework。我想要了解的是存储库。我读过的每个教程都涉及一个实体,在那个级别我有一个理解,但是多个表怎么样。我使用代码优先的变体,我将模型类与现有数据库相关联。在我的数据库中,有三个表;用户,旅程和用户旅程(链接表)。用户和旅程有多对多的关系。我应该为每个实体都有一个存储库吗?在这里汇总了什么用途?从长远来看,我想查询数据库以查找用户的旅程并传递给视图。

我的问题可能含糊不清,但我对这件事情感到很困惑,所以理解这一点的任何帮助都会受到赞赏!

2 个答案:

答案 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);