C# 连接到多租户应用程序的数据库?

C# 连接到多租户应用程序的数据库?,c#,asp.net,sql-server,entity-framework,multi-tenant,C#,Asp.net,Sql Server,Entity Framework,Multi Tenant,我正在创建一个多租户asp.net应用程序 我决定使用单独的MSSQL数据库还是模式 但是,我找不到关于如何动态更改数据库(理想情况下)或用户帐户的任何信息,这取决于用户应该连接到哪个数据库或帐户 我很可能有一个基表,它定义了用户应该连接到哪个数据库 使用LINQtoSQL很容易做到这一点,但我并不是到处都使用Linq,因为表是动态的,模式经常会改变 这样做的最佳方法是什么?我很乐意使用模式,但我不想让它变得非常混乱,但我也需要使用类似的方法,但以某种方式模拟该用户,以同样的方式拾取默认模式 我

我正在创建一个多租户asp.net应用程序

我决定使用单独的MSSQL数据库还是模式

但是,我找不到关于如何动态更改数据库(理想情况下)或用户帐户的任何信息,这取决于用户应该连接到哪个数据库或帐户

我很可能有一个基表,它定义了用户应该连接到哪个数据库

使用LINQtoSQL很容易做到这一点,但我并不是到处都使用Linq,因为表是动态的,模式经常会改变

这样做的最佳方法是什么?我很乐意使用模式,但我不想让它变得非常混乱,但我也需要使用类似的方法,但以某种方式模拟该用户,以同样的方式拾取默认模式

我知道您可以动态更改web.config连接字符串,但我已经尝试过了,它会在物理上更改文件内容,这也会刷新应用程序池,并导致许多其他问题


谢谢

如果您为多个租户设置了多个数据库,则可以基于租户创建连接字符串

您只需向接受连接字符串作为输入的db上下文构造函数添加重载:

public partial class SampleDbEntities
{
    public SampleDbEntities(string connectionString)
        : base(connectionString)
    {
    }
}
然后,在需要创建db上下文实例的任何地方,使用此重载并根据租户检测策略在连接字符串中插入合适的
用户名
密码

例如,当您的连接字符串如下所示:

var connectionTemplate =
    @"metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;" +
    @"provider=System.Data.SqlClient;" +
    @"provider connection string=""data source={0};" +
    @"initial catalog={1};" +
    @"persist security info=True;" +
    @"user id={2};" +
    @"password={3};" +  
    @"MultipleActiveResultSets=True;App=EntityFramework""";

string connection = string.Format(connectionTemplate, 
    @"(localdb)\v11.0", @"TestDB", @"user1" , @"password1");

var db = new SampleDbEntities(connection);
注意:

  • 基于
    web.config
    中的连接字符串创建连接字符串模板
如前所述,您的问题是基于意见的,内容广泛:堆栈溢出的主题之外。你能把它缩小到一个你不知道怎么做的特定技巧吗?