如何将全局过滤器值传递给数据库上下文

Posted

技术标签:

【中文标题】如何将全局过滤器值传递给数据库上下文【英文标题】:How to Pass global filter value to DB Context 【发布时间】:2021-12-04 09:02:32 【问题描述】:

我一直在询问具体问题,但似乎没有解决问题。我无法想象我的情况是独一无二的,所以我将尽可能简单地询问,希望有人能看到我的问题。

我有一个剃须刀页面应用程序的数据库上下文。我需要对某些实体应用全局过滤器,但是,此过滤器会因用户而异,但在会话期间永远不会改变。

本质上我需要的是

public TimeSheetContext(DbContextOptions<TimeSheetContext> options, int Branch)
            : base(options)
                    
          
            branchFilter = Branch;
            
        

一旦设置了分支过滤器,我将把过滤器应用为

modelBuilder.Entity<Branch>().HasQueryFilter(b => b.ContractorCode == branchFilter);

从逻辑上讲,这似乎是一个简单的问题,但是每当我向 CTOR 添加任何内容(例如上面的 int Branch)时,代码都不会运行。具体来说,它说我来自 appsettings 的连接字符串不存在,而它显然好像 int Branch 不是他们的,我设置了 branchFilter = 6108; 的原始值; (例如)它工作正常。

所以我的问题归结为如何将任何值传递给上下文构造函数。

您可以查看以下 2 个问题,了解我一直在问的更详细的问题。

Question 1

Question 2

【问题讨论】:

显然您的问题与 DI 有关。没有办法让 DI 将 int 注入构造函数,但问题 2 中的方法应该在您没有其他公共构造函数时立即起作用。显然 do 有(并且 DI 正在使用它而不是您显示的那个),否则您将不会收到该错误。 感谢@IvanStoev,帮助解决了这个问题。如果您将其添加为答案,我会将其标记为解决方案。 【参考方案1】:

你可以这样做

public TimeSheetContext(string connectionString) : base(GetOptions(connectionString))



private static DbContextOptions GetOptions(string connectionString)

    return SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), connectionString).Options;

【讨论】:

【参考方案2】:

通过删除上下文中的空白构造函数解决了这个问题。 所有答案都归功于 cmets 中的 Ivan。

【讨论】:

以上是关于如何将全局过滤器值传递给数据库上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何将标签的结果传递给 Django 中的过滤器?

如何解决:上下文提供程序未将新的上下文值传递给子级

Vue——的全局过滤器的创建

如何将组件的状态传递给父级?

如何传递多个值以响应本机上下文 API

将请求上下文从 Django Rest Framework 中的 Viewset 传递给序列化程序