EF Core 3.0 HasQueryFilter无法正常工作

时间:2019-11-22 11:12:49

标签: c# entity-framework ef-core-3.0

我将应用程序从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时,查询不会加载当前值以进行过滤。有人知道为什么会这样吗?编译器优化?

0 个答案:

没有答案