有没有人有一个非常完整的例子EF 6.1的通用存储库? [英] Does anyone have a very complete example generic repository for EF 6.1?

查看:123
本文介绍了有没有人有一个非常完整的例子EF 6.1的通用存储库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我自己的存储库,如下所示。然而,这并没有考虑到一些新功能,如范围特征。有人有一个包含所有内容的存储库。我在网上搜索过,但没有什么可以找到的是最近的。这是我有的我希望有更多的东西,并为许多方法提供了IQueryable:

 命名空间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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆