2013-07-10 44 views
1

我一直在学习MVC,我正在使用实体框架。我想了解的是知识库。我读过的每个教程都与一个实体有关,并且在那个级别上我有一个理解,但是多个表又如何呢?我首先使用代码的变体,将模型类与现有数据库相关联。在我的数据库中,有三个表格;用户,旅程和用户旅程(链接表)。用户和旅程有多对多的关系。我应该为每个实体拥有一个存储库吗?这里汇总了什么用途?从长远来看,我想查询数据库以查找用户的旅程并传递到视图。我应该为每个实体定义一个存储库

我的问题可能是模糊的,但我对这件事很困惑,所以在理解这件事上的任何帮助将不胜感激!

回答

1

通常不应为每个实体定义存储库,而应根据每个aggregate root定义存储库。你有不能独立生活的实体,但与某些父实体有关。这个父实体称为聚合根(aggregate root),你应该为每个实体都有一个存储库。

+0

好吧,我有有一个多对多的关系,用户和旅程表。所以我现在也有一个链接UserJourney表。这三张表是否构成一个总和?什么是聚合根?我假设用户。 –

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); 
相关问题