2

在最新版本的 Lightswitch 中,他们添加了一个查询管道方法,允许您捕获对数据库的所有查询请求,并添加一个过滤器。这允许您添加(例如)一个过滤器,将数据限制为“活动”标志为真的数据,而不必担心在您编写的每个查询上都这样做。

现在,鉴于 Lightswitch 中的数据库级别的东西都是建立在实体框架上的,我想知道那里是否有类似的东西。我正在处理一个非常大的项目,在大约 50 或 60 个单独的存储库中进行大量查询,并且真的不想要求每个开发人员检查每个存储库中的每个查询并添加代码来检查活动标志。除了所涉及的时间之外,错过查询的可能性很高,有人忘记将其包含在未来的查询中的可能性也很高。

任何人都知道这是否可以在实体框架的低级别完成?谢谢

4

1 回答 1

6

您必须能够拦截和修改您的谓词。

一。如果您已经抽象了存储库,那么您可以执行以下操作:

您的所有实体都可以从具有 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 和修改。

于 2013-01-17T16:46:28.513 回答