ef core 2为所有实体应用HasQueryFilter

时间:2017-08-22 08:21:49

标签: entity-framework entity-framework-core

有没有办法将“HasQueryFilter”全局应用于我的所有实体?我不想要 一个一个地添加模型构建器?

modelBuilder.Entity<Manufacturer>().HasQueryFilter(p => p.IsActive);

2 个答案:

答案 0 :(得分:3)

如果您有定义IsActive属性的基类或接口,则可以使用EF-Core 2.0 Filter all queries (trying to achieve soft delete)中的方法。

否则,您可以迭代实体类型,并且对于具有bool IsActive属性构建的每个类型,使用Expression类方法动态过滤表达式:

foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
    var isActiveProperty = entityType.FindProperty("IsActive");
    if (isActiveProperty != null && isActiveProperty.ClrType == typeof(bool))
    {
        var parameter = Expression.Parameter(entityType.ClrType, "p");
        var filter = Expression.Lambda(Expression.Property(parameter, isActiveProperty.PropertyInfo), parameter);
        entityType.QueryFilter = filter;
    }
}

答案 1 :(得分:1)

对于那些希望在EF Core 3.0中实现Ivan答案的人,请注意最后一行中的必要更改:

foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
    var isActiveProperty = entityType.FindProperty("IsActive");
    if (isActiveProperty != null && isActiveProperty.ClrType == typeof(bool))
    {
        var parameter = Expression.Parameter(entityType.ClrType, "p");
        var filter = Expression.Lambda(Expression.Property(parameter, isActiveProperty.PropertyInfo), parameter);
        MutableEntityTypeExtensions.SetQueryFilter(entityType, filter);
    }
}