在我的项目中,我在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);
}
任何想法,我该怎么做?
答案 0 :(得分:1)
使用IsDeleted属性创建一个接口,并从中继承所有模型。然后你可以像这样修改你的存储库:
public class EFRepository<T> : IRepository<T> where T : TypeOfYourNewInterface
现在您可以在泛型方法中访问IsDeleted。
答案 1 :(得分:0)
我找不到适合我问题的解决方案。经过更多的搜索,我结束了3个解决方案: