如何通过连接字符串创建多个db上下文实例?

时间:2013-07-19 06:45:59

标签: asp.net-mvc entity-framework database-connection connection-string dbcontext

在C#中,我有MVC代码第一个应用程序

public class CarContext : DbContext { }
第一个应用程序版本中的

。连接字符串就像

<add name="CarContext" providerName="System.Data.SqlClient" Integrated Security=true;
connectionString="Data Source=Dragon; Initial Catalog=CarDBv1;"/>

当我运行应用程序时,会创建第一个数据库版本 - CarDBv1

然后我编辑我的CarContext类,例如,添加新表,更改任何属性等,还更改应用程序版本,更改连接字符串

Initial Catalog=CarDBv1;Initial Catalog=CarDBv2;并运行项目。在这种情况下,我有2个数据库:CarDBv1CarDBv2。但是,CarContext类在应用程序中是相同的。

现在,我需要从任何控制台应用程序连接数据库及其上下文(CarContext),并使用它们的表进行转换,读取等。

我在这里找到了类似的答案:https://stackoverflow.com/a/16860878/1534785

但在我的应用程序中,上下文名称是相同的。

如何通过数据库连接字符串为应用程序中的每个CarContext创建2个实例?

1 个答案:

答案 0 :(得分:1)

您可以使用重载的构造函数到DbContext来允许上下文指向和未在app.config中声明的任意数据库。 请参阅dbConnection的构造函数。

public  class MyDbContext : DbContext, IContextOptions  {
    //ctors
    protected BosBaseDbContext(string connectionName)
        : base(connectionName) {          }

    protected BosBaseDbContext(DbConnection dbConnection, bool contextOwnsConnection)
        : base(dbConnection, contextOwnsConnection) {       }

}

用法

//datasource could be localhost, DBName the catalog name 
new MyDbContext((GetSqlConn4DbName(dataSource,dbName )),true);  


 public DbConnection GetSqlConn4DbName(string dataSource, string dbName) {
        var sqlConnStringBuilder = new SqlConnectionStringBuilder();
        sqlConnStringBuilder.DataSource = String.IsNullOrEmpty(dataSource) ? DefaultDataSource : dataSource;
        sqlConnStringBuilder.IntegratedSecurity = true;
        sqlConnStringBuilder.MultipleActiveResultSets = true;

        var sqlConnFact = new SqlConnectionFactory(sqlConnStringBuilder.ConnectionString);
        var sqlConn = sqlConnFact.CreateConnection(dbName);
        return sqlConn;
    }