Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用会话上下文的实体框架核心行级安全性_C#_Asp.net_Entity Framework - Fatal编程技术网

C# 使用会话上下文的实体框架核心行级安全性

C# 使用会话上下文的实体框架核心行级安全性,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我正在使用ASP.NET Core和Entity Framework 7(Core)编写一个使用行级安全性的多租户应用程序。 因为我的数据库托管在MicrosoftSQLServer上,所以我使用了一种方法来实施RLS 现在,我只需要在会话上下文中设置所需的租户id int visibleRows = context.MyModel.ToList().Count; 我面临的第一个问题是使用EF7运行存储过程。解决办法似乎是: var resp = context.Set<SessionV

我正在使用ASP.NET Core和Entity Framework 7(Core)编写一个使用行级安全性的多租户应用程序。 因为我的数据库托管在MicrosoftSQLServer上,所以我使用了一种方法来实施RLS

现在,我只需要在会话上下文中设置所需的租户id

int visibleRows = context.MyModel.ToList().Count;
我面临的第一个问题是使用EF7运行存储过程。解决办法似乎是:

var resp = context.Set<SessionVars>().FromSql(
          "EXECUTE sp_set_session_context @key = N'my_tenant', @value = {0};
           SELECT * FROM mySessionVars", desiredTenant).ToList();
不幸的是,结果并不像预期的那样。它的行为类似于在设置会话上下文之前检索行

这是由于EF7的快速加载造成的吗?EF7是否使用现金数据? 我怎样才能克服这个问题


我希望能够为SESSION_上下文设置我想要的任何值,并且该值在上下文中保持,直到更改或连接关闭

我很难通过阅读找到答案

EF6和未来版本我们采取的方法是 代码选择通过调用打开连接 context.Database.Connection.Open()那么它有很好的理由这样做 因此,框架将假设它想要控制开放 和关闭连接,并且将不再关闭连接 自动地

解决方案是在执行任何EF命令之前打开连接

context.Database.Connection.Open();

一些博客展示了一种不同的方法,不确定这是否有用。但我想和大家分享一下。在EntityFrameworkCore2.0中,全局查询过滤器是行级安全性的更好解决方案,而不是使用数据库@Greg0查询过滤器是一个很好的特性,但是我更喜欢注入会话上下文,这样服务器就可以验证租约了。这是怎么回事?我希望做同样的事情。或者先注入上下文,然后从客户端检索会话变量?