我正在使用 ASP.NET Core 和 Entity Framework 7 (Core) 编写一个使用行级安全性的多租户应用程序。
由于我的数据库托管在 Microsoft SQL Server 上,因此我使用了this https://msdn.microsoft.com/en-us/library/dn765131.aspx强制 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 之前检索行一样。
这是由 ef EF7 预加载引起的吗? EF7 使用缓存数据吗?
我怎样才能克服这个问题?
我希望能够为 SESSION_CONTEXT 设置任何我想要的值,并将其保留在上下文中,直到更改或连接关闭为止。
我通过阅读自己找到了答案本文 https://msdn.microsoft.com/en-us/data/dn456849.aspx,
EF6 和未来版本我们采取的方法是,如果调用
代码选择通过调用打开连接
context.Database.Connection.Open() 那么它有充分的理由这样做
所以框架会假设它想要控制打开
并关闭连接并且将不再关闭连接
自动地。
解决方案是在执行任何 EF 命令之前打开连接。
context.Database.Connection.Open();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)