C# 使用会话上下文的实体框架核心行级安全性
我正在使用ASP.NET Core和Entity Framework 7(Core)编写一个使用行级安全性的多租户应用程序。 因为我的数据库托管在MicrosoftSQLServer上,所以我使用了一种方法来实施RLS 现在,我只需要在会话上下文中设置所需的租户idC# 使用会话上下文的实体框架核心行级安全性,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
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查询过滤器是一个很好的特性,但是我更喜欢注入会话上下文,这样服务器就可以验证租约了。这是怎么回事?我希望做同样的事情。或者先注入上下文,然后从客户端检索会话变量?