如何使用 EF Core 跨租户数据库处理共享查找表?



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

系统具有某些查找表,用于定义在所有系统中保持不变的值。 例如,州、县、性别等。 该设计指出,这些将在"控件"数据库中。 "控件"数据库由我们的组织管理,因此租户可以从查找表中读取数据,但不能将数据写入表。

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

问题在于,使用 EF Core 时,我们有两个 DbContext,一个绑定到租户的数据,另一个绑定到控制数据库。 似乎没有办法定义跨数据库关系。

//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(以及所有其他"查找"属性(。

创建多租户应用程序(其中每个租户都需要拥有自己的数据库(的人员通常如何处理此问题?

使用每租户数据库时,我利用复制来控制租户数据库之间的查找表。尝试将"公共"表集中在单独的数据库中的问题在于,您将失去有效强制实施 FK 关系的能力。使用 SQL Server,您可以使用跨数据库的检查约束来代替 FK,但这会产生性能成本,IMO不值得将这些表放在每个租户数据库中的相对较低的成本。 鉴于这些应该是真正的公共表,因此不应期望它们非常频繁地更改,如果有的话。单向复制非常简单,可以作为可计划的作业进行设置甚至手动管理。

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

最新更新