加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 多租户架构的实体框架 – 按租户ID过滤单个表

发布时间:2020-12-16 00:09:02 所属栏目:asp.Net 来源:网络整理
导读:我们正在寻找一种通过实体框架中的租户ID自动过滤所有CRUD操作的方法. 我们想到的想法是: 使用表值用户定义的函数 使用存储过程(但我们真的不想,因为我们使用ORM来避免这样做) 一些如何修改用于生成SQL的模板以在每个语句上添加where子句. 一些如何修改用于
我们正在寻找一种通过实体框架中的租户ID自动过滤所有CRUD操作的方法.

我们想到的想法是:

>使用表值用户定义的函数
>使用存储过程(但我们真的不想,因为我们使用ORM来避免这样做)
>一些如何修改用于生成SQL的模板以在每个语句上添加where子句.
>一些如何修改用于在控制器中生成LINQ的模板(我们可能使用MVC).

有小费吗?

-谢谢
亚历克斯.

解决方法

Using table valued user defined functions

表值函数仅在.NET 4.5 Beta中可用(并且在代码中不可用).使用它们仍然无法帮助您,因为您必须在每个LINQ查询中使用该函数,因此它与使用where子句相同.

Using stored procedures (but we don’t really want to,as we’re using an ORM to avoid doing so)

它对一些特殊的复杂查询很有用,但通常不是你想要的.

Some how modifying the templates used to generate the SQL to add a where clause on each statement.

过于复杂,完全不同的抽象层次.

Some how modifying the templates used to generate the LINQ in the controllers (we may use MVC).

接近理想的解决方案.您只需要将对实体集的访问权限包装成一些代码,如下所示:

public class MultiTenantAccess<T> where T : IMultitenant
{
    private IDbSet<T> set;  

    ... 

    public IQueryable<T> GetQuery(int tenantID) 
    {
        return set.Where(e => e.TenantID == tenantID); 
    }
}

有时这是一个名为Generic存储库的核心,但它实际上只是EF集的包装器.您将始终使用GetQuery查询数据存储,而不是直接使用DbSet.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读