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

Val*_* B. 5 entity-framework-core asp.net-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对象)

不幸的是,这有一些缺点,我后来才认识到:

  1. TenantDatabaseInitializer有时使用不同租户的TenantDbContext.因此,不迁移任何数据库,整个请求失败.
  2. 如果同一租户有大量传入请求,则迁移通常会重叠并失败.(中间件正在捕获抛出的InvalidOperationExceptions,但这似乎不是一个好的解决方案).
  3. 它创建了许多数据库.
  4. 请求可能需要很长时间才能完成(检查迁移).

长篇介绍,简短问题:任何人都可以判断这种迁移工作流程是否是一种好的做法?如果不是:您是否更了解如何实现多租户?

我在EFCore 2.0中阅读了有关全局查询过滤器的内容,但我不确定这种方法在数据隔离方面的安全性.

谢谢!

Afs*_*bbi 5

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

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