如何使用实体框架创建通用存储库?

时间:2014-05-13 20:38:51

标签: c# git entity-framework generics

我已经编写了3个具有相同格式的存储库。如何创建通用存储库?

public class MyRepository : MyDataRepositoryBase<ASD>
{
    protected override ASD AddEntity(MyDataContext entityContext, ASD entity)
    {
        return entityContext.ASDSet.Add(entity);
    }

    protected override IEnumerable<ASD> GetEntities(MyDataContext entityContext)
    {
        return from e in entityContext.ASDSet
               select e;
    }
}

这是我到目前为止......

public class ComponentsRepository<T, U>:MyDataRepositoryBase<T>
    where T : class,new()
    where U : DbSet<U>, new()
{
    protected override T AddEntity(MyDataContext entityContext, T entity)
    {

        return entityContext.U.Add(entity);
    }
}

我基本上试图找到一种方法来调用DbSet&#34; entityContext.ASDSet&#34;不知道它是什么。

任何想法或我应该放手......

2 个答案:

答案 0 :(得分:3)

实体框架有一个Set方法,所以你可以这样做

return entityContext.Set<T>().Add(entity);

但是它不会检查你是否正在传递一个没有映射的类。所以它的使用风险由您自己承担,如果未映射则会引发异常。我们有一个基类,我们所有的实体都从这个基类继承,因此我们对它进行了约束,但即使不能保证在实体框架中映射一个类。

答案 1 :(得分:0)

对于它的价值,通用存储库被认为是反模式。这是我以前使用的实现:

public class Repository<T> : IRepository<T> where T : class
{
    private readonly IDbContext _context;
    private readonly IDbSet<T> _dbSet;

    public Repository(IDbContext context) {
        _context = context;
        _dbSet = context.Set<T>();
    }

    public void Add(T entity) {
        _dbSet.Add(entity);
    }

    public void Update(T entity) {
        _context.Entry(entity).State = EntityState.Modified;
    }

    ...
}

我的IDbContext:

public interface IDbContext
{
    IDbSet<T> Set<T>() where T : class;
    DbEntityEntry Entry<T>(T entity) where T : class;
    int SaveChanges();
    ...
}

我在UnitOfWork中使用了这个,我通过存储库检索进行了保存。也就是说,我确实发现在我的实体周围创建存储库更加清晰。