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
生成代码?
答案 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);
}
.....