限制对Entity Framework + UoW + Generic Repositories中数据库资源的访问

时间:2013-01-29 08:55:08

标签: entity-framework unit-of-work repository

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

谢谢。

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

谢谢你。

最诚挚的问候,

1 个答案:

答案 0 :(得分:0)

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