我正在开发一个Web应用程序,它有几个具有相同架构的数据库。取决于登录用户,执行查询的数据库可能不同。
我计划为每个数据库建立连接字符串,并且在存储库级别执行查询时,在创建数据库上下文时更改连接字符串。
我的问题是我在执行linq查询之前尝试将连接字符串名称动态传递给DB上下文,但是失败了。
如果有人可以帮助我这样做,并且让我知道这种方法的任何利弊,那将会感激不尽。
答案 0 :(得分:2)
您可以简单地向您的db上下文构造函数添加一个重载,该重载接受连接字符串作为输入:
public partial class SampleDbEntities
{
public SampleDbEntities(string connectionString)
: base(connectionString)
{
}
}
然后,当您需要创建db上下文的实例时,请使用此重载并在连接字符串中注入合适的username
和password
:
例如,当您的连接字符串如下所示:
var connectionTemplate = @"provider=System.Data.SqlClient;" +
@"provider connection string=""data source={0};" +
@"initial catalog=SERVERNAME;persist security info=True;" +
@"user id={1};password={2};" +
@"MultipleActiveResultSets=True;App=EntityFramework""";
然后您可以使用string.Format(connectionTemplate, DatabaseName, UserName, Password)
创建连接字符串并传递给db上下文的构造函数;
//You will provide Databasename, UserName, Password based on your logic
//for example based on the user who logged in application.
var connectionString= string.Format(connectionTemplate, DatabaseName, UserName, Password);
var db = new SampleDbEntities(connectionString);
答案 1 :(得分:0)
要更改DBContext的连接字符串,必须覆盖DBContext的构造函数。 您必须添加一个带参数连接的构造函数(您之前定义的连接...)
ex:public MYEntities(EntityConnection entityConnection) :base(entityConnection,true){}