【问题标题】:How to implement schema-per-tenant in EF core?如何在 EF 核心中实现每个租户的架构?
【发布时间】:2023-03-13 11:28:01
【问题描述】:

我发现了许多类似的问题并发布了如何做到这一点,但我不确定哪种方法更好。我认为我需要一些 DbContextFactory 类,它将根据 TenantId 返回我的上下文,但我不知道如何使用 OnModelCreating 来实现这一点。我主要看到有关 db-per-tenant 架构的帖子,但我不确定我是否知道如何将模式绑定到上下文(通过用户?)。我试图遵循这个 https://romiller.com/2011/05/23/ef-4-1-multi-tenant-with-code-first/ 但看起来这不适合最新的 EF 版本。我也检查了这个 Multi-Tenant With Code First EF6 但是 IDbModelCacheKeyProvider 发生了变化,现在在 Create 中需要 DbContext,这与我想要做的相反。你能举例说明这是怎么做的吗?

【问题讨论】:

  • 如果您需要每个租户不同的架构,那么为什么不是每个租户的数据库。然后你可以根据传入的请求在 DI 中注册不同的上下文。
  • 每个租户的架构需要更少的服务器资源
  • 然后为每个租户使用不同的上下文。
  • 是的,我正在尝试弄清楚如何为每个租户使用不同的上下文
  • 您可以为租户之间共享的表使用全局查询过滤器和租户自己的表的单独上下文的通用上下文。但我建议对所有租户使用相同的架构并依赖全局查询过滤器。使用相同的架构,您的应用程序代码无需担心架构,它适用于任何租户。

标签: c# asp.net-core entity-framework-core


【解决方案1】:

使用此代码在您的上下文中设置默认架构:

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("blogging");
    }

使用相同的连接字符串创建另一个上下文,然后执行:

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("mydifferentschemaname");
    }

这应该能实现你想要的。

还有更多信息here

您还可以将表(实体)映射到以下架构:

modelBuilder.Entity<Department>().ToTable("t_Department", "school");

【讨论】:

  • 每个模式都有相同的表。我应该在哪里传递架构名称?
  • 这是如何解决多模式问题的?
  • 我最终创建了一个具有 SchemaName 属性的类,该属性继承自 DbContext,并在构造函数中接收 SchemaName,然后在 OnModelCreating 中使用。
猜你喜欢
  • 2014-11-16
  • 2018-04-06
  • 1970-01-01
  • 2021-03-11
  • 2012-03-24
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多