我正在使用ASP.NET MVC3和Entity Framework 4。
我使用的是工作单元+通用存储库模式。
我到处搜索类似的问题,我看到很多人都有我的问题,但仍然无法找到一个好的和实用的解决方案。
我们有一个多租户数据库。
想象一下具有类似结构的数据库:
然后,对于我们拥有的每个客户
因此,当用户登录时,他与一个或多个组相关联,并且他需要有权访问与这些组关联的父资源和子资源。
现在的问题是:
我根据登录用户的ID,在存储库中将.Where()子句的预过滤实现到工作单元中。
这是有效的。
我在存储库上进行的预过滤工作正常,但当然只有直接访问TYPE A或TYPE B或TYPE C等来源的存储库时才有效。
但是资源与具有多对多表和外键的其他资源相关联。
因此,有时资源属于用户有权访问的组,但有时链接到该资源的资源属于用户无权访问的组。
如果我遍历"父母的导航属性"资源,用户可以访问所有链接的资源,甚至是属于其他组的资源。
因此,如果您从TYPE A资源开始,并遍历导航属性以达到TYPE B和TYPE C资源,则不会过滤它们。
如果您访问TYPE B和TYPE C存储库,则会对其进行过滤。
现在我的过滤器,正如我之前所说,属于Unit Of Work类,但我尝试将它们移动到自定义DBContext中,将过滤器直接应用到DBSet中,但没有任何变化:
似乎EF正在直接访问数据库以构建导航属性,因此不使用其他存储库或其他DBSet,从而避免使用预过滤器。
我们能做什么?
我看到NHibernate有全局过滤器可以完成我的任务,因此我正在评估从EF到NH的迁移。
我看到许多其他人要求.Include()过滤器,从而禁用延迟加载。
谢谢。
如果需要,我可以提供一些代码,但我希望我能正确解释我的问题。
谢谢你。
最诚挚的问候,
马
答案 0 :(得分:0)
我看到了一个映射到视图和存储过程的解决方案,但我不确定它在开发和维护方面有多难。简而言之,可以将EF模型映射到视图,其中数据将被过滤;在此解决方案中,每个用户都拥有自己的数据库凭据。