我正在使用 dotnet
6,并且想要在 ef core 中创建一个全局查询过滤器,以动态检查我的身份验证 ID,但是 OnModelCreating
只在 ASP.net
的生命周期中运行一次。你有什么好的想法吗?
这是我的 OnModelCreating 方法。 DeletedAt 类型是 DateTime?,我的身份验证 ID 是 CompanyId。 我从构造函数中获取 _companyId,其类型为 long?。当触发请求时,此 ID 填充,但我的想法的问题是此方法在项目启动时调用!那时,_companyId 为空,永远不会再次调用!
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyQueryFilters<IDeletedAt>(x => x.DeletedAt == null);
modelBuilder.ApplyQueryFilters<IDeletedAtAndCompany>(x => x.DeletedAt == null && x.CompanyId == _companyId);
}
这是我的ApplyQueryFilters方法,如果你需要:
public static void ApplyQueryFilters<T>(this ModelBuilder modelBuilder, Expression<Func<T, bool>> expression)
{
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
if (entityType.ClrType.GetInterface(typeof(T).Name) == null) continue;
var newParam = Expression.Parameter(entityType.ClrType);
var newBody = ReplacingExpressionVisitor
.Replace(expression.Parameters.Single(), newParam, expression.Body);
modelBuilder.Entity(entityType.ClrType).HasQueryFilter(Expression.Lambda(newBody, newParam));
}
}
我觉得我需要一个新的想法来解决这个问题。