实体框架更改现有DbContext的数据库

时间:2013-11-28 09:01:36

标签: c# entity-framework

如果我有以下代码(例如,在我的存储库的构造函数中):

var db = new MyDbContext();
var entity = db.Set<Customer>();

然后我做:

db.Database.Connection.ConnectionString = mySQLconnectionstring;

我是否需要'重新设置'实体?

3 个答案:

答案 0 :(得分:4)

糟糕的主意。您应该创建新的上下文实例:

var db1 = new MyDbContext("connstr1");
var db2 = new MyDbContext("connstr2");

否则你会遇到更多困难,而不是你想要的好处(如果可能的话)。请注意,每个上下文实例都会保留实体化实体的本地缓存并跟踪其更改。

由于模型相同,模型构建(EF中最重要的性能)只会发生一次。我无法想象,还有什么可以迫使你重用上下文实例。

答案 1 :(得分:0)

如果要为多个数据库使用相同的上下文,则可以这样做。 一种方法是更改​​内存中上下文的连接字符串。 在更改要使用的数据库之前。拨打这段代码:

        var connStr="YOUR_NEW_DB_CONNECTION_STRING_HERE";
        var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings");
        connectionStringsSection.ConnectionStrings["YOUR_DB_CONNECTION_STRING_NAME_EG_CONN_STR"].ConnectionString = connStr;
        connectionStringsSection.ConnectionStrings["YOUR_DB_CONNECTION_STRING_NAME_EG_CONN_STR"].ProviderName = "System.Data.EntityClient";
        config.Save();
        ConfigurationManager.RefreshSection("connectionStrings");

答案 2 :(得分:0)

编写新的类文件并将此方法添加到您的上下文中

public partial class YourEntitities
{
    public void SetDatabase(string dataBase)
    {
        string connString = Database.Connection.ConnectionString;
        Regex rgx = new Regex(@"(?<=initial catalog=)\w+");
        string newconnString = rgx.Replace(connString, dataBase);
        //string  = connString.Replace("{database}", dataBase);
        Database.Connection.ConnectionString = newconnString;
    }
}