通过模型构建器ef core 3中的IsDelete字段进行自动化过滤器查询[重复]

问题描述 投票:0回答:1

我不想在标志为IsDelete=true时返回实体。我已经为所有实体编写了此代码:

builder.HasQueryFilter(x => !x.IsDelete)

我想为模型构建器中的所有实体编写代码,而不是在IentityTypeConfiguration中一个接一个地编写代码。

我该怎么办?

c# entity-framework asp.net-core entity-framework-core
1个回答
1
投票

此实现要求您拥有用于实现ISoftDeleteAware接口的实体,因此,如果您有自己的接口,请相应地重命名:

public interface ISoftDeleteAware
{
    bool IsDeleted { get; set; }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);        
    //Mapping code etc …        
    var versionedEntities = modelBuilder.Model.GetEntityTypes();

    foreach (var entityType in versionedEntities)
    {
        modelBuilder.Entity(entityType.ClrType, entityBuilder =>
        {
        //Global Filters
        var lambdaExp = ApplyEntityFilterTo(entityType.ClrType);    
        if (lambdaExp != null)
            entityBuilder.HasQueryFilter(lambdaExp);
        });
    }
}

protected virtual LambdaExpression ApplyEntityFilterTo(Type entityClrType)
{
    if (typeof(ISoftDeleteAware).IsAssignableFrom(entityClrType))
    {
        var parameter = Expression.Parameter(entityClrType, "entity");            
        var member = Expression.Property(parameter, nameof(ISoftDeleteAware.IsDeleted));            
        var body = Expression.Equal(member, Expression.Constant(false));                
        return Expression.Lambda(body, parameter);
    }
    return null;
}
© www.soinside.com 2019 - 2024. All rights reserved.