有没有办法将“HasQueryFilter”全局应用于我的所有实体?我不想要 一个一个地添加模型构建器?
modelBuilder.Entity<Manufacturer>().HasQueryFilter(p => p.IsActive);
答案 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);
}
}