【问题标题】:EF Core global query filter caches the first filter valueEF Core 全局查询过滤器缓存第一个过滤器值
【发布时间】:2021-01-16 12:46:47
【问题描述】:

我正在尝试使用 .NET 5 和 EF Core 构建多租户应用程序,并且我想将全局查询过滤器设置为始终在任何查询中包含 TenantId 过滤器

我尝试了很多方法并遵循了docs,但问题是 EF 缓存了第一个过滤器,并且在更改 TenantId 时不会更新

我编写了以下代码来模拟每个请求更改的 TenantId:

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<Account>().HasQueryFilter(x => x.TenantId == TenantId);
        }

        public int TenantId => DateTime.Now.Second;

当我跟踪执行的查询时,TenantId 总是相同的

【问题讨论】:

  • 如果TenantId 是上下文的属性,它不会被缓存。您的真实代码很可能与此处显示的不同。
  • @IvanStoev 你说得对,当我在上下文中移动属性时它确实有效,谢谢!但是有什么方法可以依赖上下文之外的属性吗?

标签: .net .net-core entity-framework-core


【解决方案1】:

你需要更新tenantId比较 从x =&gt; x.TenantId == _tenantIdx =&gt; EF.Property&lt;int&gt;(x, "TenantId") == _tenantId

 public class MyAppContext : DbContext
 {
        private readonly int _tenantId;
        public MyAppContext (int tenantId)
        {
            _tenantId = tenantId;
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            //If your tenantId comparision is as following, then tenantId will not updated
            //modelBuilder.Entity<Account>().HasQueryFilter(x => x.TenantId == _tenantId);

            //If your tenantId comparision is as following, 
            //then tenantId will updated every query excecution
            modelBuilder.Entity<Account>()
            .HasQueryFilter(x => EF.Property<int>(x, "TenantId") == _tenantId);
        }
  }

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2021-12-25
    • 1970-01-01
    • 2022-10-23
    • 2021-08-21
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2015-07-03
    相关资源
    最近更新 更多