您必须能够拦截和修改您的谓词。
一。如果您已经抽象了存储库,那么您可以执行以下操作:
您的所有实体都可以从具有 Active 属性的抽象类或接口继承,您的代码将是:
interface IActivatable {
bool IsActive {get;set;}
}
class Repository<EntityType>
where EntityType : class, IActivatable {
private StackOverflowEntities context;
public IQueryable<EntityType> GetAll() {
return context.Set<EntityType>().Where(e => e.IsActive == false);
}
}
这样,GetAll 返回带有初始谓词的 IQueryable,其余部分将添加 AND。像这样:
Repository<Person> persons;
var results = persons.GetAll().Where(p => p.IsMarried == false);
这将导致谓词等于p.IsMarried == false && p.IsActive == false
二。如果根本无法更改存储库代码或代码,您可以为每个表创建一个视图。该视图可以只在 where 子句中包含 IsActive 以排除记录,然后根据这些视图重新加载您的 EDMX - 至少这是我们过去常用的方式。
编辑:
三。如果您将生成的 DbContext 暴露给客户端代码,您可以这样做:
public partial class StackOverflowEntities : DbContext
{
public StackOverflowEntities()
: base("name=StackOverflowEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public DbSet<Blog> Blogs {
return this.Set<Blog>().Where(b => b.IsActive == false);
}
}
只是意味着您必须关闭自动代码生成或修改 T4 模板。更容易获取生成的代码,打开 gen 和修改。