如何迭代C#中的所有entite?

时间:2018-03-08 15:16:10

标签: c# entity-framework

在我的ModelContext中,我有注册查询过滤器的功能,我在OnModelCreating(ModelBuilder builder)方法中运行。

private void RegisterQueryFilters(ModelBuilder builder)
        {
            builder.Entity<Apple>().HasQueryFilter(e => e.ProductId == ProductId);
            builder.Entity<Orange>().HasQueryFilter(e => e.ProductId == ProductId);
            builder.Entity<Kiwi>().HasQueryFilter(e => e.ProductId == ProductId);
            builder.Entity<Banana>().HasQueryFilter(e => e.ProductId == ProductId);
        }

总是当我添加新实体时,我必须把它放在这里。但是我担心有一天会有人忘记在这里加上这个。是否有任何方法迫使用户以某种方式添加它?或者可以迭代所有实体并对所有实体执行相同的功能。像这样:

private void RegisterQueryFilters(ModelBuilder builder)
{
     foreach (var entity in AllEntity)
     {
        builder.Entity<entity>().HasQueryFilter(e => e.ProductId == ProductId);    
     }
}

2 个答案:

答案 0 :(得分:-1)

有一个nuget包:EntityFramework.DynamicFilters如果你在EF 6上

https://www.nuget.org/packages/EntityFramework.DynamicFilters/

我认为即使在EF 7 /核心中它也可以开箱即用(不需要那个nuget)

首先:让所有权限实现一个接口或从一个抽象类继承(在下一行中称为EntityBase)

第二步:将其添加到DBContext中的OnModelCreating

modelBuilder.Filter("IsDeleted", (EntityBase d) => d.Deleted, false);

Grtz

答案 1 :(得分:-1)

我不确定我是否完全理解你的要求,但我想你会从中获益的是从类派生的所有类型的列表

List<Type> knownTypes = new List<Type>();
foreach(Type t in Assembly.GetExecutingAssembly().GetTypes())
{
    if (typeof(Entity).IsAssignableFrom(t))
        knownTypes.Add(t);
}