【问题标题】: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)
            {
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多