Entity Framework 6 設置連接字元串執行時
我們處於一個混合環境中,我們的應用程序同時使用 ADO.NET 和實體框架。
由於兩者都指向同一個物理 SQL 伺服器,我們想從配置文件中刪除實體框架連接字元串,然後根據目前的 ADO.NET 連接字元串自動建構字元串。
這使我們避免了開發人員更改 ADO.NET 字元串但忘記更改實體框架連接字元串的錯誤。
我讀過這個,但他們沒有回答這個問題。
如何在 Entity Framework 6 中以程式方式創建與 MS SQL 的連接字元串?
如果我創建自己的 DbConnection 並將其傳遞給 DbContext(existingConnection, contextOwnsConnection),則會引發錯誤“上下文正在 Code First 模式下使用,程式碼是從 EDMX 文件生成的用於 Database First 或 Model First 開發。 "
我沒有使用程式碼優先。
<https://msdn.microsoft.com/en-us/data/jj680699>
這談到了 EF 6 中的程式碼庫配置,但文章沒有顯示任何實際更改連接字元串的程式碼。
更新:更多資訊有助於澄清我的問題。
我沒有先使用程式碼,而是想在配置文件之外建構一個連接字元串。
我使用的 DbContext 是 T4 模板正在生成的自動生成的 DbContext 文件的部分類。
我的印像是我需要創建一個繼承的 DbConfiguration 類並在該類中執行某些操作,但我發現的唯一範例是使用 Azure。
<https://msdn.microsoft.com/en-us/data/jj680699>
有一篇關於程式碼項目的文章談到了在執行時設置連接字元串,但這篇文章是基於每次我創建一個新實體時建構一個連接字元串容器。
<http://www.codeproject.com/Tips/234677/Set-the-connection-string-for-Entity-Framework-at>
我希望能夠使用我的部分 DbContext 類來創建連接字元串,這樣呼叫者就不必做任何特別的事情。
更新:執行時的工作程式碼但不是
設計時使用@Circular Reference 發布的“下面列出”的程式碼,我能夠更改連接字元串,而無需更改對我的實體類的呼叫,但這不適用於 DesignTime EDMX 文件。
public partial class TestEntities : DbContext { public TestEntities() : base(GetSqlConnection(), true) { } public static DbConnection GetSqlConnection() { // Initialize the EntityConnectionStringBuilder. EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); var connectionSettings = ConfigurationManager.ConnectionStrings("Current_ADO_Connection_In_Config"); // Set the provider name. entityBuilder.Provider = connectionSettings.ProviderName; // Set the provider-specific connection string. entityBuilder.ProviderConnectionString = connectionSettings.ConnectionString; // Set the Metadata location. entityBuilder.Metadata = "res://*/Models.TestModel.csdl|res://*/Models.TestModel.ssdl|res://*/Models.TestModel.msl"; return new EntityConnection(entityBuilder.ToString()); } }現在,如果我能讓 DesignTime 正常工作,那就太好了。
您將收到 Code First 模式異常,因為您正在傳遞
DbConnection使用 ADO.NET 連接字元串建構的內容。此連接字元串不包含對元數據文件的引用,因此 EntityFramework 不知道在哪裡可以找到它們。要
DbContext使用適當的以程式方式設置的連接字元串創建一個,請使用EntityConnectionStringBuilder類。var entityBuilder = new EntityConnectionStringBuilder(); // use your ADO.NET connection string entityBuilder.ProviderConnectionString = conString; // Set the Metadata location. entityBuilder.Metadata = @"res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl"; var dbContext = new DbContext(entityBuilder.ConnectionString);
您可以在設計時使用配置文件中的連接字元串進行工作。
<add name="DWContext" connectionString="metadata=res://*/Database.DWH.DWModel.csdl|res://*/Database.DWH.DWModel.ssdl|res://*/Database.DWH.DWModel.msl;provider=System.Data.SqlClient;provider connection string="data source=SQLSERVER_INSTANCE;initial catalog=DB_NAME;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />所以不要刪除它,因為你只在設計時需要它。
使用此方法在執行時以動態方式工作(類似於您的上一個方法):
擴展數據上下文部分類:
public partial class DWContext { public DWContext(string nameOrConnectionString) : base(nameOrConnectionString) { } /// <summary> /// Create a new EF6 dynamic data context using the specified provider connection string. /// </summary> /// <param name="providerConnectionString">Provider connection string to use. Usually a standart ADO.NET connection string.</param> /// <returns></returns> public static DWContext Create(string providerConnectionString) { var entityBuilder = new EntityConnectionStringBuilder(); // use your ADO.NET connection string entityBuilder.ProviderConnectionString = providerConnectionString; entityBuilder.Provider = "System.Data.SqlClient"; // Set the Metadata location. entityBuilder.Metadata = @"res://*/Database.DWH.DWModel.csdl|res://*/Database.DWH.DWModel.ssdl|res://*/Database.DWH.DWModel.msl"; return new DWContext(entityBuilder.ConnectionString); } }並從您的程式碼中創建一個新的 EF 數據上下文:
private DWContext db = DWContext.Create(providerConnectionString);你好 ;-)