Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 限制对实体框架中数据库资源的访问+;UoW&x2B;通用存储库_Entity Framework_Unit Of Work_Repository - Fatal编程技术网

Entity framework 限制对实体框架中数据库资源的访问+;UoW&x2B;通用存储库

Entity framework 限制对实体框架中数据库资源的访问+;UoW&x2B;通用存储库,entity-framework,unit-of-work,repository,Entity Framework,Unit Of Work,Repository,我正在使用ASP.NET MVC3和实体框架4 我使用的是工作单元+通用存储库模式 我到处寻找类似的问题,我看到很多人都有我的问题,但仍然找不到一个好的和切实可行的解决办法 我们有一个多租户数据库 设想一个具有类似结构的数据库: 顾客 组,与客户关联 与一个或多个组关联的用户 然后,对于我们的每个客户 资源,与一个或多个组关联,并通过外键、多对多关系等相互链接 因此,当用户登录时,他与一个或多个组关联,他需要访问与该组关联的父资源和子资源 现在的问题是: 我根据登录用户的id在存储库中的

我正在使用ASP.NET MVC3和实体框架4

我使用的是工作单元+通用存储库模式

我到处寻找类似的问题,我看到很多人都有我的问题,但仍然找不到一个好的和切实可行的解决办法

我们有一个多租户数据库

设想一个具有类似结构的数据库:

  • 顾客
  • 组,与客户关联
  • 与一个或多个组关联的用户
然后,对于我们的每个客户

  • 资源,与一个或多个组关联,并通过外键、多对多关系等相互链接
因此,当用户登录时,他与一个或多个组关联,他需要访问与该组关联的父资源和子资源

现在的问题是:

我根据登录用户的id在存储库中的工作单元中使用.Where()子句实现了一种预过滤

这是有效的

我对存储库进行的预过滤工作正常,但当然,只有当您直接访问类型A、类型B或类型C等源的存储库时,它才会工作

但是一个资源通过多对多表和外键链接到其他资源

因此,有时资源属于用户有权访问的组,但有时链接到此资源的资源属于用户无权访问的组

如果遍历“父”资源的导航属性,用户可以访问所有链接的资源,甚至是属于其他组的资源

因此,如果您从类型a资源开始,并遍历导航属性以到达类型B和类型C资源,则不会对它们进行筛选

如果访问类型B和类型C存储库,则会对它们进行筛选

现在,正如我前面所说,我的过滤器是以工作类为单位的,但我尝试将它们移动到自定义DBContext中,将过滤器直接应用到DBSet中,但没有任何变化:

似乎EF直接访问数据库以构建导航属性,因此不使用其他存储库或其他数据库集,从而避免了预过滤器

我们能做什么

我看到NHibernate有全局过滤器可以完成我的任务,所以我正在评估从EF到NH的迁移

我看到许多其他人要求使用.Include()过滤器,从而禁用延迟加载

多谢各位

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

谢谢你,i.a

致以最良好的祝愿


Marco

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

谢谢您的回答,Oleg。我理解你的解决方案,但我担心这将是一个痛苦的维持,所以我会等待其他建议。顺便说一句,谢谢。任何人都知道EF 5或EF 6是否会实施某种形式的(,或者可能是全局筛选器?任何对NHibernate有经验的人都可以告诉我,我是否可以使用全局筛选器完成此任务?任何人都有其他解决方案吗?恐怕我必须迁移到NHibernate。仅供参考,我打开了一个问题代码库,实体框架团队表示,他们将评估未来版本的场景。很好,但这项功能是uservoice.com至少在最近两年中排名前十的请求之一,所以机会不大。