有没有人有一个非常完整的例子EF 6.1的通用存储库? [英] Does anyone have a very complete example generic repository for EF 6.1?
本文介绍了有没有人有一个非常完整的例子EF 6.1的通用存储库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
命名空间Services.Repositories
{
///< summary>
///用于数据访问的EF依赖的通用存储库
///< / summary>
///< typeparam name =T>此存储库的实体类型< / typeparam>
public class GenericRepository< T> :IRepository< T>其中T:class
{
public GenericRepository(DbContext dbContext)
{
if(dbContext == null)
throw new ArgumentNullException(需要DbContext的一个实例使用这个存储库,上下文);
DbContext = dbContext;
DbSet = DbContext.Set< T>();
}
protected DbContext DbContext {get;组; }
protected DbSet< T> DbSet {get;组; }
public virtual IQueryable< T> Find(Expression< Func< T,bool>>谓词)
{
return DbSet.Where< T>(predicate);
}
public virtual IQueryable< T> GetAll()
{
return DbSet;
}
public virtual T GetById(int id)
{
//返回DbSet.FirstOrDefault(PredicateBuilder.GetByIdPredicate< T>(id));
return DbSet.Find(id);
}
public virtual void Add(T entity)
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if(dbEntityEntry.State!= EntityState.Detached)
{
dbEntityEntry.State = EntityState.Added;
}
else
{
DbSet.Add(entity);
}
}
public virtual void Update(T entity)
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if(dbEntityEntry.State == EntityState.Detached)
{
DbSet.Attach(entity);
}
dbEntityEntry.State = EntityState.Modified;
}
public virtual void Delete(T entity)
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if(dbEntityEntry.State!= EntityState.Deleted)
{
dbEntityEntry.State = EntityState.Deleted;
}
else
{
DbSet.Attach(entity);
DbSet.Remove(entity);
}
}
public virtual void Delete(int id)
{
var entity = GetById(id);
if(entity == null)return; // 未找到;假设已经删除。
删除(实体);
}
}
}
解决方案
您可以添加以下新功能:
public virtual void AddRange(IEnumerable< T>实体)
{
DbContext.Set< T>()。AddRange(entities);
}
public virtual void RemoveRange(IEnumerable< T>实体)
{
DbContext.Set&T;()。RemoveRange(entities);
}
I have my own repository that is as follows. However this does not take into account some of the new features such as the range features. Does anyone have a repository that includes everything. I have searched for this on the net but there's nothing that I can find that is recent. Here is what I have. I am hoping for something that has more and that offers IQueryable for many of the methods:
namespace Services.Repositories
{
/// <summary>
/// The EF-dependent, generic repository for data access
/// </summary>
/// <typeparam name="T">Type of entity for this Repository.</typeparam>
public class GenericRepository<T> : IRepository<T> where T : class
{
public GenericRepository(DbContext dbContext)
{
if (dbContext == null)
throw new ArgumentNullException("An instance of DbContext is required to use this repository", "context");
DbContext = dbContext;
DbSet = DbContext.Set<T>();
}
protected DbContext DbContext { get; set; }
protected DbSet<T> DbSet { get; set; }
public virtual IQueryable<T> Find(Expression<Func<T, bool>> predicate)
{
return DbSet.Where<T>(predicate);
}
public virtual IQueryable<T> GetAll()
{
return DbSet;
}
public virtual T GetById(int id)
{
//return DbSet.FirstOrDefault(PredicateBuilder.GetByIdPredicate<T>(id));
return DbSet.Find(id);
}
public virtual void Add(T entity)
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if (dbEntityEntry.State != EntityState.Detached)
{
dbEntityEntry.State = EntityState.Added;
}
else
{
DbSet.Add(entity);
}
}
public virtual void Update(T entity)
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if (dbEntityEntry.State == EntityState.Detached)
{
DbSet.Attach(entity);
}
dbEntityEntry.State = EntityState.Modified;
}
public virtual void Delete(T entity)
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if (dbEntityEntry.State != EntityState.Deleted)
{
dbEntityEntry.State = EntityState.Deleted;
}
else
{
DbSet.Attach(entity);
DbSet.Remove(entity);
}
}
public virtual void Delete(int id)
{
var entity = GetById(id);
if (entity == null) return; // not found; assume already deleted.
Delete(entity);
}
}
}
解决方案
You can add new features like this:
public virtual void AddRange(IEnumerable<T> entities)
{
DbContext.Set<T>().AddRange(entities);
}
public virtual void RemoveRange(IEnumerable<T> entities)
{
DbContext.Set<T>().RemoveRange(entities);
}
这篇关于有没有人有一个非常完整的例子EF 6.1的通用存储库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文