【问题标题】:Entity Framework Core 3.0: Modify configured Global Query during runtimeEntity Framework Core 3.0:在运行时修改配置的全局查询
【发布时间】:2019-10-07 13:18:45
【问题描述】:

我有以下要求:

在模型配置期间,我为实体创建了一个 QueryFilter

var entity = modelBuilder.Entity<TBaseTable>().HasQueryFilter(r => r.UserId == CurrentUserId)

因此,在某些情况下,CurrentUserId 在运行时会发生变化。但我的 QueryFilter 没有得到刷新。过滤条件仍然适用于我在配置期间使用的旧 UserId 值。如何修改在配置期间设置的 QueryFiler?如果我是对的,那么整个模型已经被缓存并且不会被重新初始化。有什么想法吗?

【问题讨论】:

  • 什么是CurrentUserIdTBaseTable 是什么?流利的代码在哪里?我问是因为如果CurrentUserId 是派生数据库上下文的属性/字段,代码位于该上下文的OnModelCreating 覆盖内,而TBaseTable 是具体实体类型,过滤器将是动态的并且可以工作正如预期的那样。
  • CurrentUserId 由全局类实例提供。它不是实体的属性值。因此查询将使用配置 DbContext 的第一个用户的 Id。这完全符合我的预期。之后可以切换 CurrentUser。所以 CurrentUserId 会改变,但查询似乎仍然使用启动时提供的值。现在看起来,我必须重新声明全局查询过滤器。但我不知道我该怎么做。模型配置完成后。
  • 无法重新声明全局过滤器。但是可以通过使用 db 上下文的属性/方法/字段来使它们动态化。请参阅 Global Query Filters 文档中的 TenantId 示例。因此,请确保 CurrentUserId 是您的上下文的一个属性 - 属性 getter 仍然可以从某个全局类实例返回一个值。不同之处在于,EF Core 将在需要应用过滤器的任何时候重新评估属性,而不是在创建模型时只重新评估一次。
  • 这正是我所需要的。通过 DbContext 属性提供过滤器值解决了我的问题。非常感谢您的帮助!

标签: ef-core-3.0


【解决方案1】:

诀窍是将CurrentUserId 声明为DbContext 类的属性- 属性getter 仍然可以从全局类实例返回值。

可以通过使用 db 上下文的属性/方法/字段来使全局过滤器动态化。请参阅 Global Query Filters 文档中的 TenantId 示例。

(由于我需要阅读 cmets 以找到您问题的答案,因此我重新表述了“Ivan Stoev 2019 年 10 月 8 日 15:34”提供的评论并将其发布为答案)

【讨论】:

    猜你喜欢
    • 2021-08-21
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多