2

Lightswitch の最新バージョンでは、データベースへのすべてのクエリ リクエストをキャッチし、フィルタを追加できるクエリ パイプライン メソッドが追加されました。これにより、たとえば、作成するすべてのクエリでこれを行うことを心配することなく、「アクティブ」フラグが true であるデータにデータを制限するフィルターを追加できます。

さて、Lightswitch のデータベース レベルのものはすべて Entity Framework に基づいて構築されているため、似たようなものがあるのではないかと考えていました。私は非常に大規模なプロジェクトに取り組んでおり、約 50 または 60 の個別のリポジトリに大量のクエリがあり、すべての開発者にすべてのリポジトリのすべてのクエリを調べて、アクティブなフラグを確認するコードを追加するように依頼する必要はありません。必要な時間はさておき、クエリを見逃す可能性は高く、将来のクエリに含めるのを誰かが忘れる可能性も高くなります。

これがEntity Frameworkの低レベルで実行できるかどうか知っている人はいますか? ありがとう

4

1 に答える 1

6

述語を傍受して変更できる必要があります。

1。リポジトリを抽象化した場合は、次のようにすることができます。

すべてのエンティティは、Abstract クラスまたは Interface with and 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 に答える