ef core 2 对所有实体应用 HasQueryFilter

S. *_*dal 4 entity-framework entity-framework-core

有什么方法可以将“HasQueryFilter”全局应用于我的所有实体?我不想一一添加模型构建器?

modelBuilder.Entity<Manufacturer>().HasQueryFilter(p => p.IsActive);
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 11

如果您有定义IsActive属性的基类或接口,您可以使用过滤所有查询(尝试实现软删除)中的方法

否则,您可以迭代实体类型,并为每个具有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;
    }
}
Run Code Online (Sandbox Code Playgroud)

更新(EF Core 3.0):由于公共元数据 API 重大更改(用Get/Set扩展方法替换了许多属性),最后一行变为

entityType.SetQueryFilter(filter);
Run Code Online (Sandbox Code Playgroud)

  • /sf/ask/3156775961/#45097532 这对我有用。谢谢。 (2认同)