Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用EF Core跨租户数据库处理共享查找表?_C#_Entity Framework_Multi Tenant - Fatal编程技术网

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

C# 如何使用EF Core跨租户数据库处理共享查找表?,c#,entity-framework,multi-tenant,C#,Entity Framework,Multi Tenant,我们正在开发一个多租户应用程序。这种设计使得每个租户都有自己的数据库(在同一台服务器上),并且每个数据库都有相同的模式 系统具有某些查找表,这些表定义的值在所有系统中都是常量。例如,州、县、性别等。设计说明这些将在“控制”数据库中。“控制”数据库由我们的组织管理——因此租户可以从查找表中读取数据,但不能将数据写入表中 这里的想法是,我们希望避免在每个数据库中重复这些查找表和数据。如果我们必须更改一个值或添加一个新值,我们可以在一个表中完成,而不必在每个租户数据库中更新它 问题是,对于EF Cor

我们正在开发一个多租户应用程序。这种设计使得每个租户都有自己的数据库(在同一台服务器上),并且每个数据库都有相同的模式

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

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

问题是,对于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,您可以跨数据库使用检查约束来代替FKs,但这会带来性能成本,IMO不值得将这些表放在每个租户数据库中的相对较低成本。考虑到这些表应该是真正常见的表,所以不应该期望它们经常更改(如果有的话)。单向复制非常容易设置,甚至可以作为一个可调度的作业手动管理

我构造多租户应用程序的方式是,主DBContext/DB只处理身份验证、版本控制、维护跟踪,并在身份验证后传递租户的DB连接字符串