8

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<>()I am被迫从DbSetto 转换ObjectSet

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

4

1 回答 1

13

看看我不久前发布的这个提示

无论如何,诀窍是使用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);
        }
.....
于 2013-08-09T21:39:16.110 回答