使用一个DbContext在数据库之间切换

时间:2015-09-30 11:10:16

标签: c# entity-framework

我正在开发一个Web应用程序,它有几个具有相同架构的数据库。取决于登录用户,执行查询的数据库可能不同。

我计划为每个数据库建立连接字符串,并且在存储库级别执行查询时,在创建数据库上下文时更改连接字符串。

我的问题是我在执行linq查询之前尝试将连接字符串名称动态传递给DB上下文,但是失败了。

如果有人可以帮助我这样做,并且让我知道这种方法的任何利弊,那将会感激不尽。

2 个答案:

答案 0 :(得分:2)

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

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

然后,当您需要创建db上下文的实例时,请使用此重载并在连接字符串中注入合适的usernamepassword

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

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){}