2

我将 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() 过滤器,从而禁用延迟加载。

谢谢你。

如果需要,我可以提供一些代码,但我希望我能正确解释我的问题。

谢谢你

此致,

马可

4

1 回答 1

0

我看到了一个映射到视图和存储过程的解决方案,但我不确定它在开发和维护中有多难。简而言之,可以将 EF 模型映射到视图,在视图中过滤数据;在此解决方案中,每个用户都有自己的数据库凭据。

于 2013-01-29T12:50:22.403 回答