实体框架核心多租户的最佳方法

时间:2017-10-25 08:52:00

标签: asp.net-core entity-framework-core ef-core-2.0

我们基于ASP.NET Core和EFCore开发了更大的SaaS应用程序。我们通过数据库分离租户,意味着每个租户都有一个数据库。

客户端通过自定义中间件在任何传入请求上迁移数据库。这是必需的,因为在租户注册我们的SSO服务器后应立即提供应用程序。

所以管道看起来像这样:

  1. 身份验证中间件(ASP.NET核心标准)
  2. UserResolverMiddleware(从JWT令牌中提取TenantID并将其添加到HttpContext.Items)
  3. TenantDatabaseInitializerMiddleware(通过在ConnectionString中传递tenantid构建TenantDbContext对象并开始迁移)
  4. 不幸的是,这有一些缺点,我后来才认识到:

    1. TenantDatabaseInitializer有时会使用不同租户的TenantDbContext。因此,不会迁移任何数据库,整个请求也会失败。
    2. 如果同一租户有大量传入请求,则迁移通常会重叠并失败。 (中间件正在捕获抛出的InvalidOperationExceptions,但这似乎不是一个好的解决方案。)
    3. 它创建了很多数据库。
    4. 请求可能需要很长时间才能完成(检查迁移)。
    5. 冗长的介绍,简短的问题:任何人都可以判断这种迁移工作流程是否是一种好的做法?如果不是:您是否更了解如何实现多租户?

      我在EFCore 2.0中读到了全局查询过滤器,但我不确定这种方法对数据隔离的安全性。

      谢谢!

1 个答案:

答案 0 :(得分:5)

我认为每个租户创建一个数据库是不切实际的。如果你有2000个租户,那么你必须维护2000个数据库实例!

我建议为所有应用程序和租户使用1个数据库。并为大多数表添加TenantId,以便您可以找出此特定记录属于哪个租户。