我将应用程序从EF Core 2更新为EF Core3。其中一项重大更改是“不再在客户端上评估LINQ查询” (https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#linq-queries-are-no-longer-evaluated-on-the-client)。
>所以我不得不更改以下GlobalQueryFilter
:
# EF Core2
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
{
.....
builder.HasQueryFilter(x => CheckMandatorId(x));
}
bool CheckMandatorId(TEntity entity)
{
if (HttpContextMiddleware.Current != null && HttpContextMiddleware.MandatorId != null)
{
return HttpContextMiddleware.MandatorId == entity.MandatorId;
}
return true;
}
到
# EF Core 3
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
{
.....
builder.HasQueryFilter(x => CheckMandatorId() == -1 || x.MandatorId == CheckMandatorId());
}
int CheckMandatorId()
{
return HttpContextMiddleware.MandatorId ?? -1;
}
问题是:在EF Core 2中,每次执行查询时,当前的mandatorId都用于queryfilter。在Core 3中,切换强制变量后不会更新使用的MandatorId。
任何想法如何解决这个问题?如果有其他解决方案,我不想重构整个后端。
更新: 当我在Constructor中设置mandatorId时,一切都按预期运行。
public DbContext()
{
MandatorId = HttpContextMiddleware.MandatorId ?? -1;
}
但是,当我直接在HttpContextMiddleware.MandatorId
中调用builder.HasQueryFilter
时,查询不会加载当前值以进行过滤。有人知道为什么会这样吗?编译器优化?