如何刷新 EntityFramework 核心 5 模型或查询过滤器缓存?

How to refresh EntityFramework core 5 model or query filter cache?

我在租户上有这个查询过滤器:

m.Builder.HasQueryFilter(mm => EF.Property<int>(mm, "TenantId") == SindikatDataSetBase.TenantId);

当我以不同的用户身份登录到桌面应用程序时,静态变量 SindikatDataSetBase.TenantId 发生变化,但查询过滤器仍使用以前的 TenantId 值。

嗯,使用静态变量是不好的。 EF Core 支持过滤器中的变量,如果它们是 DbContext

的一部分

在您的 DbContext TenantId 中创建 属性 并初始化,例如在构造函数中或使用默认初始化。

public class MyDbContext: DbContext
{
   public int TenantId { get; set; } = SindikatDataSetBase.TenantId;

   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
      modelBuilder.Entity<SomeEntity>()
        .HasQueryFilter(mm => EF.Property<int>(mm, "TenantId") == TenantId);
   }
}

之后每个新 MyDbContext 都会捕获您的静态变量,EF 可以创建正确的查询。

更新

如何避免在 DbContext

中配置参数化的 QueryFilter

想法很简单 - 模仿我们已经在 DbContext 的方法中。

MyDbContext ctx = null;
m.Builder.HasQueryFilter(mm => EF.Property<int>(mm, "TenantId") == ctx.TenantId);