将连接字符串动态传递给EF

时间:2015-04-20 14:12:08

标签: entity-framework asp.net-web-api connection-string

My Web APi调用使用EF Context处理数据的Repository层。上下文调用

public MyContext()
        : base("name=MyDbContext")
    {
    }

MyDbContext在WebConfig中定义。

现在问题是我拥有许多相同数据库的副本,登录的用户将确定要使用哪个数据库。我想找到一种在运行时动态传递Connection String的方法。

请告知

谢谢,

3 个答案:

答案 0 :(得分:1)

只需将其他构造函数添加到您自己的上下文中,如果将连接字符串传递给基础构造函数,EF将使用此构造函数。

public MyContext()
    : base("name=MyDbContext")
{
}

public MyContext(string nameOrConnectionString)
        : base(nameOrConnectionString)
    {
    }

现在当你调用构造函数时,只需传递正确的Connectionstring。

答案 1 :(得分:1)

  • 如果事先知道所有数据库,请将它们全部放在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) { }
 }

答案 2 :(得分:0)

您可以提供已指定连接字符串的连接

public MyContext(SqlConnection connection)
        : base(connection, true)
    {
    }