我已经编写了3个具有相同格式的存储库。如何创建通用存储库?
public class MyRepository : MyDataRepositoryBase<ASD>
{
protected override ASD AddEntity(MyDataContext entityContext, ASD entity)
{
return entityContext.ASDSet.Add(entity);
}
protected override IEnumerable<ASD> GetEntities(MyDataContext entityContext)
{
return from e in entityContext.ASDSet
select e;
}
}
这是我到目前为止......
public class ComponentsRepository<T, U>:MyDataRepositoryBase<T>
where T : class,new()
where U : DbSet<U>, new()
{
protected override T AddEntity(MyDataContext entityContext, T entity)
{
return entityContext.U.Add(entity);
}
}
我基本上试图找到一种方法来调用DbSet&#34; entityContext.ASDSet&#34;不知道它是什么。
任何想法或我应该放手......
答案 0 :(得分:3)
实体框架有一个Set方法,所以你可以这样做
return entityContext.Set<T>().Add(entity);
但是它不会检查你是否正在传递一个没有映射的类。所以它的使用风险由您自己承担,如果未映射则会引发异常。我们有一个基类,我们所有的实体都从这个基类继承,因此我们对它进行了约束,但即使不能保证在实体框架中映射一个类。
答案 1 :(得分:0)
对于它的价值,通用存储库被认为是反模式。这是我以前使用的实现:
public class Repository<T> : IRepository<T> where T : class
{
private readonly IDbContext _context;
private readonly IDbSet<T> _dbSet;
public Repository(IDbContext context) {
_context = context;
_dbSet = context.Set<T>();
}
public void Add(T entity) {
_dbSet.Add(entity);
}
public void Update(T entity) {
_context.Entry(entity).State = EntityState.Modified;
}
...
}
我的IDbContext:
public interface IDbContext
{
IDbSet<T> Set<T>() where T : class;
DbEntityEntry Entry<T>(T entity) where T : class;
int SaveChanges();
...
}
我在UnitOfWork中使用了这个,我通过存储库检索进行了保存。也就是说,我确实发现在我的实体周围创建存储库更加清晰。