如果我有以下代码(例如,在我的存储库的构造函数中):
var db = new MyDbContext();
var entity = db.Set<Customer>();
然后我做:
db.Database.Connection.ConnectionString = mySQLconnectionstring;
我是否需要'重新设置'实体?
答案 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;
}
}