多租户架构的实体框架 - 按租户ID过滤单个表

时间:2012-03-06 16:30:13

标签: asp.net entity-framework multi-tenant

我们正在寻找一种通过实体框架中的租户ID自动过滤所有CRUD操作的方法。

我们想到的想法是:

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

任何提示?

-Thanks 亚历克斯。

2 个答案:

答案 0 :(得分:13)

  

使用表值用户定义的函数

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

  

使用存储过程(但我们真的不想,因为我们使用ORM来避免这样做)

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

  

如何修改用于生成SQL的模板,以便在每个语句中添加where子句。

太复杂,完全不同的抽象层次。

  

如何修改用于在控制器中生成LINQ的模板(我们可以使用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

答案 1 :(得分:3)

您也可以将租户数据分成不同的数据库 或者进入相同的数据库,但使用不同的模式?您可以在旧的MSDN文章“Multi-Tenant Data Architecture

中阅读有关此内容的更多信息