对DbContext的通用访问

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

 public class DataRepositoryEF5 where T: DbContext { private ObjectContext _context; public DataRepositoryEF5(DbContext context) { _context = ((IObjectContextAdapter)context).ObjectContext; } public IEnumerable ReadAll() where TEntity : class,new() { return GetObjectSet().AsEnumerable(); } protected ObjectSet GetObjectSet() where TEntity : class,new() { ObjectSet result; result = _context.CreateObjectSet(); return result; } } 

用法

  var context = new MyContext(); var repository = new DataRepositoryEF5(context); IEnumerable results = repository.GetAll(); foreach (var item in results) { Console.WriteLine("{0} {1} {2} {3}", item.Description, item.Id, item.Property, item.Whatever); } 

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

其次,因为没有ObjectContext.CreateObjectSet()等价物,我被迫从DbSetObjectSet

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

看看我刚才发布的这个提示

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

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