2012-03-06 32 views
7

我们正在寻找一种方式,通过实体框架中的承租人ID自动筛选所有CRUD操作。多租户体系结构的实体框架 - 由租户筛选单个表ID

我们以为的想法是:

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

任何提示?

-thanks Alex。

回答

13

使用表值用户定义函数

表值函数是仅在.NET 4.5测试版(和在代码不可用第一)。使用它们仍然不会帮助你,因为你必须在每个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); 
    } 
} 

有时候,这是一些所谓的通用仓库的核心,但它实际只是EF组的包装。您将始终使用GetQuery来查询您的数据存储,而不是直接使用DbSet

+0

中阅读更多关于此的最佳答案,谢谢@Ladislav。 – 2012-03-06 16:50:34

+0

嗨@Ladislav我很难看出IMultitenant应该包含什么,你有空余的时刻你能够详细说明吗?谢谢:-) – 2012-03-08 13:10:15

+0

其实只是想,我想IMultitenant会包含TenantId?我在正确的路线? – 2012-03-08 13:11:50

3

您也可以将租户数据分成不同的数据库
或同一个数据库,但是有不同的模式?您可以在旧的MSDN文章“Multi-Tenant Data Architecture

+1

谢谢奥克曼,是的,我读过过去这是一篇很好的文章。当时只有一个共享的db共享模式适合我们,但这是一个有价值的链接,可以从这个问题中列出来+1。 – 2013-06-04 08:32:08