【问题标题】:Connecting to database for Multi-Tenant application?连接到多租户应用程序的数据库?
【发布时间】:2015-09-22 13:11:33
【问题描述】:

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

我正在选择不同的 MSSQL 数据库或模式。

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

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

使用 Linq to SQL 很容易做到这一点,但我并没有在任何地方都使用 Linq,因为表是非常动态的,并且架构会经常更改。

这样做的最佳方法是什么?我很高兴看到使用模式,但我不希望它变得非常混乱,但我还需要采取类似的方法,但以相同的方式冒充该用户以获取默认模式。

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

谢谢

【问题讨论】:

  • 正如所写,您的问题是基于意见的且广泛的:堆栈溢出的主题。你能把它缩小到你不知道怎么做的特定技术吗?

标签: c# asp.net sql-server entity-framework multi-tenant


【解决方案1】:

如果您已经为多个租户设置了多个数据库,您可以根据租户创建连接字符串。

您可以简单地向接受连接字符串作为输入的数据库上下文构造函数添加一个重载:

public partial class SampleDbEntities
{
    public SampleDbEntities(string connectionString)
        : base(connectionString)
    {
    }
}

然后,无论您需要创建数据库上下文的实例,使用此重载并根据您的租户检测策略在连接字符串中注入合适的usernamepassword

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

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 中的连接字符串创建连接字符串模板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 2017-12-23
    • 1970-01-01
    • 2017-08-01
    • 2015-06-22
    相关资源
    最近更新 更多