2014-03-19 52 views
0

我正在使用實體框架6.02和Vb.net與Sql服務器數據庫。在運行時更改實體連接字符串

我在4個不同的服務器上有4個相同的數據庫。我通過嚮導中的一個數據庫創建實體。現在我想在運行時修改連接字符串,以便與其他數據庫連接。

這是我做這個變革:{}服務器和數據庫名稱與{} DATABASE

<connectionStrings> 
<add name="MyEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source={SERVER};initial catalog={DATABASE};integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
</connectionStrings> 

這是在Visual Studio中的app.config連接字符串(我已經改變了服務器名稱

這是更改連接字符串代碼:

Public Cnstring as string 

Dim connstringtemplate As String = System.Configuration.ConfigurationManager.ConnectionStrings(1).ConnectionString.ToString 

Cnstring = connstringtemplate.Replace("{DATABASE}", "MyDB2").Replace("{SERVER}","PC2").Tostring 

這是我的實體類接受連接字符串參數:

Partial Public Class MyEntities 
Inherits DbContext 
Public Sub New(connectionString As String) 
    If String.IsNullOrWhiteSpace(connectionString) Then 
      Throw New ArgumentNullException("connectionString") 
    End If 
    Database.Connection.ConnectionString = connectionString 
End Sub 

這是實體聲明:

context = New MyEntities(cnstring) 

但現在在運行時我得到一個錯誤就行了

Database.Connection.ConnectionString = connectionString 
An unhandled exception of type 'System.ArgumentException' occurred in System.Data.dll 

Additional information: Keyword not supported: 'metadata'. 

有什麼不對的代碼?

謝謝!

+0

你從哪兒弄來從連接字符串? –

+0

此連接字符串位於app.config中。 – alex

+0

自動生成? –

回答

0

DbContext構造函數接受連接字符串作爲參數。 建立連接字符串並將其傳遞給構造函數可能會更好。

我用類似:

// the model name in the app.config connection string (any model name - Model1?) 
private static string GetConnectionString(string model, settings) 
{ 
    // Build the provider connection string with configurable settings 
    var providerSB = new SqlConnectionStringBuilder 
    { 
     InitialCatalog = settings.InitialCatalog, 
     DataSource = settings.DataSource, 
     UserID = settings.User, 
     Password = settings.Password 
    }; 

    var efConnection = new EntityConnectionStringBuilder(); 
    // or the config file based connection without provider connection string 
    // var efConnection = new EntityConnectionStringBuilder(@"metadata=res://*/model1.csdl|res://*/model1.ssdl|res://*/model1.msl;provider=System.Data.SqlClient;"); 
    efConnection.Provider = "System.Data.SqlClient"; 
    efConnection.ProviderConnectionString = providerSB.ConnectionString; 
    // based on whether you choose to supply the app.config connection string to the constructor 
    efConnection.Metadata = string.Format("res://*/Model.{0}.csdl|res://*/Model.{0}.ssdl|res://*/Model.{0}.msl", model); ; 
    return efConnection.ToString(); 

}