EF代码首先检查通用存储库中的属性

时间:2014-06-10 09:16:42

标签: entity-framework asp.net-mvc-5 repository-pattern code-first

在我的项目中,我在Code Camper结构之后使用了EF Code First方法。所以我有通用存储库IRepository;

public interface IRepository<T> where T : class
{
    IQueryable<T> GetAll();
    T GetById(int id);
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    void Delete(int id);
}

然后它的实施EFRepository<T>

public class EFRepository<T> : IRepository<T> where T : class
{
    public EFRepository(DbContext dbContext)
    {
        if (dbContext == null) 
            throw new ArgumentNullException("dbContext");
        DbContext = dbContext;
        DbSet = DbContext.Set<T>();
    }

    protected DbContext DbContext { get; set; }

    protected DbSet<T> DbSet { get; set; }

    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);
    }
}

根据客户需求,我不应该删除任何数据库记录,因此对于大多数(并非所有)表,我都有isDeleted属性将记录标记为已删除。这些标记为isDeleted 的记录不应

显示给用户

我的问题是:在我的通用存储库实现中如何检查isDeleted属性,而我期待通用对象T。 例如GetAll函数应为:

public virtual IQueryable<T> GetAll()
{
    return DbSet.where(x=>x.isDelete == false);
}

任何想法,我该怎么做?

2 个答案:

答案 0 :(得分:1)

使用IsDeleted属性创建一个接口,并从中继承所有模型。然后你可以像这样修改你的存储库:

public class EFRepository<T> : IRepository<T> where T : TypeOfYourNewInterface

现在您可以在泛型方法中访问IsDeleted。

答案 1 :(得分:0)

我找不到适合我问题的解决方案。经过更多的搜索,我结束了3个解决方案:

  1. Create extension methods.
  2. Create a custom IDbSet which can accept a filter expression.
  3. Add a discriminator to every model.
  4. 我选择了解决方案(3),但我不太喜欢