【问题标题】:How to handle shared lookup tables across tenant databases using EF Core?如何使用 EF Core 跨租户数据库处理共享查找表?
【发布时间】:2020-01-13 12:15:44
【问题描述】:

我们正在开发一个多租户应用程序。设计是这样的,每个租户都有自己的数据库(在同一台服务器上),每个数据库都有相同的架构。

系统具有某些查找表,这些查找表定义了在所有系统中都将保持不变的值。例如,州、县、性别等。设计声明这些将在“控制”数据库中。 “控制”数据库由我们的组织管理——因此租户可以从查找表中读取数据,但不能将数据写入表中。

这里的想法是我们希望避免在每个数据库中重复这些查找表和数据。如果我们必须更改一个值或添加一个新值,我们可以在一个表中完成,而不必在每个租户数据库中更新它。

问题在于,使用 EF Core,我们有两个 DbContext——一个与租户的数据相关联,一个与 Control 数据库相关联。似乎没有定义跨数据库关系的方法。

示例

//Table exists in each Tenant Database
public class Client{
    public int Id {get; set;}
    public string Firstname {get; set;}
    public string Lastname {get; set;}

    //Table of Counties defined in "Control" database
    public int CountyOfResidenceId { get; set;}
    public County CountyOfResidence {get; set;}

}

我能想到的处理这种设计的唯一方法是必须(在我的 API 控制器中)验证来自客户端的 id(通过查找控制数据库)并手动填充 CountyOfResidence(以及所有其他“查找”属性)用于从数据库读取的每个客户端。

创建要求每个租户拥有自己的数据库的多租户应用程序的人通常如何处理这个问题?

【问题讨论】:

    标签: c# entity-framework multi-tenant


    【解决方案1】:

    在使用 DB-per-Tenant 时,我利用复制来控制跨租户 DB 的查找表。尝试将“通用”表集中在单独的数据库中的问题是您失去了有效实施 FK 关系的能力。使用 SQL Server,您可以使用跨数据库的检查约束来代替 FK,但这会产生性能成本,IMO 值得将这些表放在每个租户数据库中的相对较低的成本。鉴于这些应该是真正常见的表,它们不应该被期望非常频繁地改变,如果有的话。单向复制非常简单,可以作为一项可调度的作业手动设置甚至管理。

    我构建多租户应用程序的方式是,主 DBContext/DB 仅处理身份验证、版本控制、维护跟踪,并在通过身份验证后移交租户的数据库连接字符串。

    【讨论】:

      猜你喜欢
      • 2012-12-14
      • 2012-10-06
      • 2019-05-18
      • 2014-03-21
      • 2016-07-17
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 2021-05-23
      相关资源
      最近更新 更多