如何刷新 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);
我在租户上有这个查询过滤器:
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
想法很简单 - 模仿我们已经在 DbContext 的方法中。
MyDbContext ctx = null;
m.Builder.HasQueryFilter(mm => EF.Property<int>(mm, "TenantId") == ctx.TenantId);