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的类.由于不再是这种情况,我可以拥有的最佳约束是……
其次,因为没有ObjectContext.CreateObjectSet<>()的等价物,我被迫从DbSet转换为ObjectSet.
有了这个模式,我就不需要DbContext了.没有泛型,我被迫手工编写所有CRUD操作代码.我错过了什么?如果没有,是否可以告诉EF5使用ObjectContext生成代码?
解决方法
看看我刚刚发布的这个
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); } .....