【问题标题】:ef core 2 apply HasQueryFilter for all entityef core 2 对所有实体应用 HasQueryFilter
【发布时间】:2017-08-22 08:21:49
【问题描述】:

有没有办法将“HasQueryFilter”全局应用于我的所有实体?我不想 一个一个地添加modelbuilder?

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

【问题讨论】:

标签: entity-framework entity-framework-core


【解决方案1】:

如果您有定义IsActive 属性的基类或接口,您可以使用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;
    }
}

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

entityType.SetQueryFilter(filter);

【讨论】:

  • stackoverflow.com/questions/45096799/… 这对我有用。谢谢。
  • 无法在 EF Core 3 上设置 QueryFilter 属性。引发 System.MissingMethodException:'找不到方法:'无效 Microsoft.EntityFrameworkCore.Metadata.IMutableEntityType.set_QueryFilter(System.Linq.Expressions.LambdaExpression)'。
  • @Onur EF Core 3.0 仍处于预览阶段(测试版),因此使用它需要您自担风险。我会在 3.0 发布时更新答案。在那之前,你可以看看expected breaking changes——很可能QueryFilter属性被GetQueryFilterSetQueryFilter扩展方法替换。
  • 感谢@IvanStoev,切换到稳定的 EF Core 2.2.4 版本并且它工作正常。
  • @ModestMonk 使用 Expression.Equal(Expression.Property(parameter, "StatusCode"), Expression.Constant("Active")) 作为 lambda 的主体。
【解决方案2】:

对于那些希望在 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);
    }
}

【讨论】:

  • 嗨,我使用了下面的代码:var parameter = Expression.Parameter(entity.ClrType, "p"); var PropertyOrField = Expression.PropertyOrField(parameter, "IsActive"); modelBuilder.Entity(entity.ClrType) .HasQueryFilter(Expression.Lambda( Expression.Equal(PropertyOrField, Expression.Constant(true)), parameter));
猜你喜欢
  • 2021-04-30
  • 1970-01-01
  • 2018-05-09
  • 2020-04-09
  • 1970-01-01
  • 2018-06-04
  • 2021-05-17
  • 2022-10-18
相关资源
最近更新 更多