EF使用通用和特定的存储库

时间:2012-03-26 22:56:54

标签: asp.net-mvc-3 entity-framework frameworks entity

我有以下通用存储库:

public class GenericRepository<TEntity> where TEntity : class {
    private EFDbContext context;
    private DbSet<TEntity> dbSet;

    public GenericRepository(EFDbContext context) {}

    public IEnumerable<TEntity> GetAll() {}

    public IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = "") {}

    public TEntity GetByID(int id) {}

    public void Insert(TEntity entity) {}

    public void Delete(int id) {}

    public void Delete(TEntity entity) {}

    public void Update(TEntity entity) {}
}    

现在我明白了如何将它用于我的实体,但是如果实体需要的不仅仅是这些方法,我不明白该怎么办?假设我有一个名为'锦标赛'的实体,我希望获得该锦标赛中的所有小组,“GetTournamentGroups”方法会在哪里进行?

我是否应该编写一个基本的存储库接口,而不是使用通用存储库,所有实体自己的接口继承该接口,然后只添加每个实体所需的其他方法?

2 个答案:

答案 0 :(得分:2)

你也可以简单地使用

var TournamentGroups = new List<Group>();
using( var GenericRepo = new GenericRepository<Group>())
{
 TournamentGroups = GenericRepo.Get(group => group.TournamentId == tournamentId);
}

使用您的普通存储库。制作一个能够做到这一点的课程似乎有点过头了。

答案 1 :(得分:1)

方法GetTournamentGroups()似乎属于Repository层上面的层:

class TournamentModel
{
    private int tournamentId;  // initialized in constructor
    private GenericRepository<Group> repository;  // initialized in constructor

    IEnumerable<Group> GetTournamentGroups()
    {
        return repository.Get( group => group.TournamentId == tournamentId);
    }
}

我建议在GenericRepository中使用IEuumerable的IQueryable insteam。如果您需要在进行实际数据库查询之前应用过滤器或对表达式进行排序,那么它会更灵活。