1

我一直在学习 MVC,我正在使用实体框架。我想了解的是存储库。我读过的每个教程都处理一个实体,在那个级别我有一个理解,但是多个表呢。我使用代码优先的变体,将我的模型类与现有数据库相关联。在我的数据库中,有三个表;User、Journey 和 UserJourney(链接表)。User 和 Journey 是多对多的关系。我应该为每个实体都有一个存储库吗?聚合在这里有用吗?从长远来看,我想查询数据库以查找用户的旅程并传递给视图。

我的问题可能含糊不清,但我对这个问题很困惑,所以任何有助于理解这一点的帮助都将不胜感激!

4

2 回答 2

2

通常不应为每个实体定义存储库,而应为每个aggregate root. 您的实体不能独立存在,但与某些父实体相关。此父实体称为聚合根,您应该为它们中的每一个拥有一个存储库。

于 2013-07-10T12:55:00.917 回答
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);
于 2013-07-10T23:07:49.420 回答