对DbContext的通用访问

时间:2013-08-09 16:11:22

标签: c# entity-framework repository-pattern

ObjectContext允许对生成的实体进行通用访问。 DbContext似乎没有这样的支持。使用通用存储库访问EF5具有挑战性。假设我想要一个通用机制来读取任何给定的实体,称之为TEntity:

public class DataRepositoryEF5<T> where T: DbContext
{
    private ObjectContext _context;        

    public DataRepositoryEF5(DbContext context)
    {
        _context = ((IObjectContextAdapter)context).ObjectContext;
    }

    public IEnumerable<TEntity> ReadAll<TEntity>() where TEntity : class,new()
    {
        return GetObjectSet<TEntity>().AsEnumerable();
    }

    protected ObjectSet<TEntity> GetObjectSet<TEntity>() where TEntity : class,new()
    {
        ObjectSet<TEntity> result;
        result = _context.CreateObjectSet<TEntity>();
        return result;
    }
}

用法

            var context = new MyContext();            
            var repository = new DataRepositoryEF5<MyContext>(context);

            IEnumerable<Document> results = repository.GetAll<Document>();

            foreach (var item in results)
            {
                Console.WriteLine("{0} {1} {2} {3}", item.Description, item.Id, item.Property, item.Whatever);
            }

EF用于生成具有公共基类型EntityObject的类。由于不再是这种情况,我可以拥有的最佳约束是class ...

其次,因为没有相等的ObjectContext.CreateObjectSet<>()我被迫从DbSet投射到ObjectSet

有了这种模式,我就不需要DbContext了。没有泛型,我被迫手工编写所有CRUD操作代码。我错过了什么?如果没有,是否可以告诉EF5使用ObjectContext生成代码?

1 个答案:

答案 0 :(得分:10)

看一下我之前发布的tip

无论如何,诀窍是使用context.Set<>

public interface IEntity
        {
            int Id { get; set; } 
        } 

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity
    {
        private IDbContext _context;
        public Repository(IDbContext context)
        {
            _context = context;
        }
          private IDbSet<TEntity> DbSet
         {
            get
            {
                return _context.Set<TEntity>();
            }
         }
          public IQueryable<TEntity> GetAll() 
          {
             return DbSet.AsQueryable(); 
          }
        public void Delete(TEntity entity)
        {
             DbSet.Remove(entity);
        }
.....