.net - 我可以在 Entity Framework 中进行模型级过滤吗?

标签 .net entity-framework

在最新版本的 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/

相关文章:

C# 打开 DBF 文件

.net - 如何查找已传递给我的模拟(Moq 或 Rhino Mocks)接口(interface)上的方法的值?

entity-framework - EF CTP5 映射具有不同列名的主键

c# - 那里有好的第三方 EDMX 生成器/更新器工具吗?

c# - Quartz.net 的 Unity LifeTime 管理器

c# - 使用 Unirest C# 将 http 响应主体转换为 JSON 格式

c# - .net - 如何将 Windows 服务与系统托盘应用程序连接

.net - 为什么在静态方法中可以使用 const 变量?

c# - 使用 Entity Framework 恢复和备份

c# - 在 LINQ 中重新排序记录