我很抱歉發佈此問題,但我無法評論我的問題的實際解決方案,但回答爲here。 This solution也不能以相同的方式工作。實體框架 - 在運行時更改連接字符串(需要說明)
我使用該解決方案和擴展似乎工作本身除了實際更改連接。它保持與web.config
文件中定義的相同。如果我刪除該連接字符串,我會收到錯誤,說EF無法找到它。
我的做法是數據庫第一(此外,它的SQL Server 2000中...)和EF版本6(基本上,最新)
所以我的問題是 - 它如何工作?
- 我是否必須將相同的連接名稱傳遞給擴展方法,因爲它在
web.config
中定義,或者它應該不同嗎?
我現在的連接字符串如下所示:
<connectionStrings>
<add name="CATALOGEntities" connectionString="metadata=~/bin/Models\InfoModel.csdl|~/bin/Models\InfoModel.ssdl|~/bin/Models\InfoModel.msl;provider=System.Data.SqlClient;provider connection string="data source=SERVER;initial catalog=CATALOG;integrated security=False;User Id=admin;Password=admin123;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
未遂1:這是我傳遞給擴展方法是什麼:
ConnectionTools.ChangeDatabase(db, "ANOTHERCATALOG", "ANOTHERSERVER", "admin", "admin456", false, "ANOTHERCATALOGEntities");
未遂2:嘗試正如VDohnal所建議的那樣:
db.ChangeDatabase("ANOTHERCATALOG", "ANOTHERSERVER", "admin", "admin456", false, "ANOTHERCATALOGEntities");
public partial class CATALOGEntities : DbContext {
public CATALOGEntities(string connectionString) : base(connectionString) { }
public CATALOGEntities() {
// TODO: Complete member initialization
Database.SetInitializer<CATALOGEntities>(null);
}
}
未遂4:不工作,要麼(假設我有web.config
(source)中定義2個連接字符串):
if (infoWhole.QueryDetails.IsCountryUK)
{
string strConn = ConfigurationManager.ConnectionStrings["CATALOGEntities"].ConnectionString;
db = new CATALOGEntities(strConn);
}
else
{
string strConn = ConfigurationManager.ConnectionStrings["CATALOGEntitiesUSA"].ConnectionString;
db = new CATALOGEntities(strConn);
}
- 還等什麼我應該將數據源傳遞給擴展方法 - 整個
DbContext
或我正在使用的控制器類中定義的那個,即CATALOGEntities
?
這裏是擴展方法,我使用:
public static class ConnectionTools
{
// all params are optional
public static void ChangeDatabase(
this CATALOGEntities source,
string initialCatalog = "",
string dataSource = "",
string userId = "",
string password = "",
bool integratedSecuity = false,
string configConnectionStringName = "")
/* this would be used if the
* connectionString name varied from
* the base EF class name */
{
try
{
// use the const name if it's not null, otherwise
// using the convention of connection string = EF contextname
// grab the type name and we're done
var configNameEf = string.IsNullOrEmpty(configConnectionStringName)
? source.GetType().Name
: configConnectionStringName;
// add a reference to System.Configuration
var entityCnxStringBuilder = new EntityConnectionStringBuilder
(System.Configuration.ConfigurationManager
.ConnectionStrings[configNameEf].ConnectionString);
// init the sqlbuilder with the full EF connectionstring cargo
var sqlCnxStringBuilder = new SqlConnectionStringBuilder
(entityCnxStringBuilder.ProviderConnectionString);
// only populate parameters with values if added
if (!string.IsNullOrEmpty(initialCatalog))
sqlCnxStringBuilder.InitialCatalog = initialCatalog;
if (!string.IsNullOrEmpty(dataSource))
sqlCnxStringBuilder.DataSource = dataSource;
if (!string.IsNullOrEmpty(userId))
sqlCnxStringBuilder.UserID = userId;
if (!string.IsNullOrEmpty(password))
sqlCnxStringBuilder.Password = password;
// set the integrated security status
sqlCnxStringBuilder.IntegratedSecurity = integratedSecuity;
// now flip the properties that were changed
source.Database.Connection.ConnectionString
= sqlCnxStringBuilder.ConnectionString;
}
catch (Exception ex)
{
// set log item if required
}
}
}
我的DbContext:
public partial class CATALOGEntities : DbContext
{
public CATALOGEntities()
: base("name=CATALOGEntities")
{
}
}
我沒有建議exactlty你在嘗試2寫什麼,最後一個參數不應該在那裏。你調試上下文創建?至於嘗試3 - 我懷疑你可以這樣做,不用修改TT模板,因爲EF自動生成DBContext構造函數。您應該首先通過修改TT來禁用生成構造函數。嘗試4肯定會起作用 - 但不要將嘗試3與嘗試4結合在一起。調試嘗試4並查看連接字符串並在創建後立即測試數據庫連接。 – 2014-10-02 06:07:52