对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()
等价物,我被迫从DbSet
为ObjectSet
。
有了这个模式,我就不需要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); } .....