在最新版本的 Lightswitch 中,他们添加了一个查询管道方法,允许您捕获对数据库的所有查询请求,并添加一个过滤器。这允许您添加(例如)一个过滤器,将数据限制为“事件”标志为 true 的数据,而不必担心在您编写的每个查询上都这样做。
现在,鉴于 Lightswitch 中的数据库级内容全部构建在 Entity Framework 上,我想知道那里是否有类似的东西。我正在处理一个非常大的项目,在大约 50 或 60 个单独的存储库中有大量查询,我真的不想让每个开发人员检查每个存储库中的每个查询并添加代码来检查事件标志。除了所涉及的时间之外,遗漏查询的可能性很高,有人忘记将其包含在未来查询中的可能性也很高。
有人知道这是否可以在 Entity Framework 中的低级别完成吗?谢谢
最佳答案
您必须能够拦截和修改您的谓词。
一个。如果你已经抽象了你的存储库,那么你可以做这样的事情:
您的所有实体都可以继承自抽象类或具有 Active 属性的接口(interface),您的代码将是:
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
两个。如果更改您的存储库代码或代码根本不切实际,您可以为每个表创建一个 View 。该 View 可以只在 where 子句中包含 IsActive 以排除记录,然后根据这些 View 重新加载您的 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);
}
}
只是意味着你必须关闭auto-code gen或者修改T4模板。更容易只获取生成的代码,关闭生成并修改。
关于.net - 我可以在 Entity Framework 中进行模型级过滤吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14383485/