我正在使用ASP.NET Core和Entity Framework 7(Core)使用行级安全性编写多租户应用程序。 由于我的数据库托管在Microsoft SQL Server上,因此我使用this方法来强制执行RLS。
现在我需要的是在SESSION_CONTEXT中设置所需的tenant_id。
我遇到的第一个问题是使用EF7运行存储过程。解决方案似乎是:
var resp = context.Set<SessionVars>().FromSql(
"EXECUTE sp_set_session_context @key = N'my_tenant', @value = {0};
SELECT * FROM mySessionVars", desiredTenant).ToList();
使用上面的命令我可以清楚地看到SESSION_CONTEXT已成功设置。现在我希望看到根据我在SESSION_CONTEXT中设置的租户对同一上下文的下一个查询进行过滤。
int visibleRows = context.MyModel.ToList().Count;
不幸的是结果并不像预期的那样。它的行为类似于在设置SESSION_CONTEXT之前检索的行。
这是由EF7的Eager Loading引起的吗?是EF7使用兑现数据? 我怎么能克服这个?
我希望能够为SESSION_CONTEXT设置我想要的任何值,并且这个值在上下文中保持,直到更改或关闭连接。
答案 0 :(得分:4)
通过阅读this article
,我无法找到答案EF6和未来的版本我们采取了如果调用的方法 代码选择通过调用打开连接 context.Database.Connection.Open()然后它有一个很好的理由 所以框架将假设它想要控制开放 并关闭连接,将不再关闭连接 自动。
解决方案是在执行任何EF命令之前打开连接。
context.Database.Connection.Open();