P.B*_*key 7 c# entity-framework repository-pattern
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;
}
}
Run Code Online (Sandbox Code Playgroud)
用法
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);
}
Run Code Online (Sandbox Code Playgroud)
EF用于生成具有公共基类型的类EntityObject.由于不再是这种情况,我可以拥有的最佳约束是class......
其次,因为没有相当于ObjectContext.CreateObjectSet<>()我被迫从投DbSet来ObjectSet.
有了这种模式,我就没有必要了DbContext.没有泛型,我被迫手工编写所有CRUD操作代码.我错过了什么?如果没有,是否有可能告诉EF5生成代码ObjectContext?
Mas*_*uso 10
看看我刚才发布的这个提示
无论如何,诀窍是使用 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);
}
.....
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11574 次 |
| 最近记录: |