我们正在寻找一种方式,通过实体框架中的承租人ID自动筛选所有CRUD操作。多租户体系结构的实体框架 - 由租户筛选单个表ID
我们以为的想法是:
- 使用表值用户定义函数
- 使用存储过程(但我们真的不希望,因为我们使用的ORM,以避免这样做)
- 一些如何修改用于生成SQL的模板以在每个语句上添加where子句。
- 一些如何修改用于在控制器中生成LINQ的模板(我们可能使用MVC)。
任何提示?
-thanks Alex。
我们正在寻找一种方式,通过实体框架中的承租人ID自动筛选所有CRUD操作。多租户体系结构的实体框架 - 由租户筛选单个表ID
我们以为的想法是:
任何提示?
-thanks Alex。
使用表值用户定义函数
表值函数是仅在.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
。
您也可以将租户数据分成不同的数据库
或同一个数据库,但是有不同的模式?您可以在旧的MSDN文章“Multi-Tenant Data Architecture”
谢谢奥克曼,是的,我读过过去这是一篇很好的文章。当时只有一个共享的db共享模式适合我们,但这是一个有价值的链接,可以从这个问题中列出来+1。 – 2013-06-04 08:32:08
中阅读更多关于此的最佳答案,谢谢@Ladislav。 – 2012-03-06 16:50:34
嗨@Ladislav我很难看出IMultitenant应该包含什么,你有空余的时刻你能够详细说明吗?谢谢:-) – 2012-03-08 13:10:15
其实只是想,我想IMultitenant会包含TenantId?我在正确的路线? – 2012-03-08 13:11:50