【发布时间】:2019-10-07 13:18:45
【问题描述】:
我有以下要求:
在模型配置期间,我为实体创建了一个 QueryFilter
var entity = modelBuilder.Entity<TBaseTable>().HasQueryFilter(r => r.UserId == CurrentUserId)
因此,在某些情况下,CurrentUserId 在运行时会发生变化。但我的 QueryFilter 没有得到刷新。过滤条件仍然适用于我在配置期间使用的旧 UserId 值。如何修改在配置期间设置的 QueryFiler?如果我是对的,那么整个模型已经被缓存并且不会被重新初始化。有什么想法吗?
【问题讨论】:
-
什么是
CurrentUserId?TBaseTable是什么?流利的代码在哪里?我问是因为如果CurrentUserId是派生数据库上下文的属性/字段,代码位于该上下文的OnModelCreating覆盖内,而TBaseTable是具体实体类型,过滤器将是动态的并且可以工作正如预期的那样。 -
CurrentUserId 由全局类实例提供。它不是实体的属性值。因此查询将使用配置 DbContext 的第一个用户的 Id。这完全符合我的预期。之后可以切换 CurrentUser。所以 CurrentUserId 会改变,但查询似乎仍然使用启动时提供的值。现在看起来,我必须重新声明全局查询过滤器。但我不知道我该怎么做。模型配置完成后。
-
无法重新声明全局过滤器。但是可以通过使用 db 上下文的属性/方法/字段来使它们动态化。请参阅 Global Query Filters 文档中的
TenantId示例。因此,请确保CurrentUserId是您的上下文的一个属性 - 属性 getter 仍然可以从某个全局类实例返回一个值。不同之处在于,EF Core 将在需要应用过滤器的任何时候重新评估属性,而不是在创建模型时只重新评估一次。 -
这正是我所需要的。通过 DbContext 属性提供过滤器值解决了我的问题。非常感谢您的帮助!
标签: ef-core-3.0