我正在创建一个多租户asp.net应用程序。
我在单独的MSSQL数据库或模式之间做出决定。
但是,我无法找到有关如何动态更改数据库(理想情况下)或用户帐户的任何信息,具体取决于用户应连接到哪个帐户。
我很可能会有一个基表来定义用户应该连接到哪个数据库。
使用Linq to SQL执行此操作非常简单,但我没有在任何地方使用Linq,因为这些表非常动态,而且架构很容易经常更改。
这样做的最佳方法是什么?我很高兴看到使用Schemas,但我不希望它变得非常混乱,但我还需要做一个类似的方法,但不知何故用同样的方式冒充用户来拾取默认模式。
我知道你可以动态更改web.config连接字符串,但我已经尝试过,它实际上会更改文件内容,这也会刷新应用程序池并导致很多其他问题。
由于
答案 0 :(得分:2)
如果您为多个租户设置了多个数据库,则可以根据租户创建连接字符串。
您可以简单地向您的db上下文构造函数添加一个重载,该重载接受连接字符串作为输入:
public partial class SampleDbEntities
{
public SampleDbEntities(string connectionString)
: base(connectionString)
{
}
}
然后,只要您需要创建数据库上下文的实例,请使用此重载并根据租户检测策略在连接字符串中注入合适的username
和password
。
例如,当您的连接字符串如下所示:
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
中的连接字符串创建连接字符串模板。