【问题标题】:Passing connection string dynamically to EF将连接字符串动态传递给 EF
【发布时间】:2015-04-20 14:12:07
【问题描述】:
我的 Web APi 调用使用 EF 上下文处理数据的存储库层。上下文调用
public MyContext()
: base("name=MyDbContext")
{
}
MyDbContext 在 WebConfig 中定义。
现在的问题是我有许多相同数据库的副本,登录的用户将确定要针对哪个数据库工作。我想找到一种在运行时动态传递连接字符串的方法。
请指教
谢谢,
【问题讨论】:
标签:
entity-framework
asp.net-web-api
connection-string
【解决方案1】:
只需将另一个构造函数添加到您自己的上下文中,如果您将连接字符串传递给基本构造函数,EF 将使用这个。
public MyContext()
: base("name=MyDbContext")
{
}
public MyContext(string nameOrConnectionString)
: base(nameOrConnectionString)
{
}
现在当您调用构造函数时,只需传递正确的 Connectionstring。
【解决方案2】:
- 如果你事先知道所有的数据库,那么把它们都放在 app.config 中
- 如果你事先知道connectionString,那么将它传递给dbContext
DBContext 有一个接受 connectionName 或 ConnectionString 的构造函数
- 将 DBConnection 传递给 Context 构造函数
我知道您只询问了连接字符串,但是当涉及到迁移和多数据库控制时,在 EF 中传递连接的选项可以证明更容易使用。
public static DbConnection GetSqlConn4DBName(string dbName) {
var sqlConnFact = new SqlConnectionFactory(
"Data Source=localhost; Integrated Security=True; MultipleActiveResultSets=True");
var sqlConn = sqlConnFact.CreateConnection(dbName);
return sqlConn;
}
use
var dbName = "MyDB1";
var sqlConn = GetSqlConn4DBName(dbName);
var context = new Ef6Ctx(sqlConn);
but equally
var context = new Ef6Ctx("Data Source=localhost;Initial Catalog=MyDBName ;Integrated Security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" );
您的上下文构造函数实际上也可以使用各种构造函数。
public class Ef6Ctx3 : DbContext {
public Ef6Ctx3() : base("ConnName"){ } // default Connection
public Ef6Ctx3(DbConnection dbConn) : base(dbConn, true) { }
public Ef6Ctx3(string connectionNameOrString) : base(connectionNameOrString) { }
}
【解决方案3】:
您可以使用已指定的连接字符串提供连接
public MyContext(SqlConnection connection)
: base(connection, true)
{
}