我不想在标志为IsDelete=true
时返回实体。我已经为所有实体编写了此代码:
builder.HasQueryFilter(x => !x.IsDelete)
我想为模型构建器中的所有实体编写代码,而不是在IentityTypeConfiguration
中一个接一个地编写代码。
我该怎么办?
此实现要求您拥有用于实现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;
}