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