2011-11-23 54 views
1

我正在設置一個dev,qa,staging,生產系統的部署。我希望能夠促進從一個環境發佈到下一個環境,而無需從VS重新發布,也無需手動觸摸任何文件。基於環境確定連接字符串,同時使用實體框架

我需要單獨的DEV,QA和STG/PRO數據庫,所以這意味着連接字符串需要根據環境動態切換。

我可以在數據層做到這一點 - 可能類似於這樣的:Managing ASP.NET Development, Staging and Production Connection Strings (without pulling your hair out) - 但我的數據層是建立在實體框架之上的。

問題:有沒有辦法在使用實體框架時實現連接字符串的動態切換?

+0

[基於環境使用EF 4.1/DbContext切換連接字符串]的可能重複(http://stackoverflow.com/questions/7434753/switch-connection-strings-based-on-environment-with-ef-4-1- dbcontext) – Faust

回答

1

我正在設置一個dev,qa,stage,production system of deployment。 I 希望能夠將下一版本從一個環境發佈到 ,而無需從VS重新發布,也無需手動 觸摸任何文件。

這真是奇怪而不好的要求。在部署到不同環境期間重新配置應用程序是絕對常見的。與其在應用程序中對此進行硬編碼,應該有不同的安裝/部署腳本集,當從一個環境移動到另一個環境時,這些腳本也會更改您的配置文件。

爲配置中的所有環境保持配置是恕我直言很糟糕的做法。

即使使用硬編碼解決方案,您仍然需要更改一些「配置」來告訴應用程序當前運行的環境。硬編碼解決方案將使用關於環境的信息從配置文件中選擇正確的連接字符串並將其傳遞給上下文構造函數。

作爲提到的方法的例子,你可以試試這個。它仍然會要求你在每次重新部署應用程序時更改環境變量 - 例如修改的複雜性在自定義部署腳本是完全一樣的替換連接字符串:

配置文件:

<appSettings> 
    <add key="environment" value="Dev"/> 
</appSettings> 
<connectionStrings> 
    <add name="Dev" connectionString="..."/> 
</connectionStrings> 

代碼上下文工廠方法:

public static YourContext ContextFactory() 
{ 
    string environment = WebConfigurationManager.AppSettings["environment"].Value; 
    // This should be correctly recognized as a name of connection string. 
    return new YourContext(environment); 
} 

上下文:

public class YourContext : DbContext 
{ 
    public YourContext(string connectionStringName) : base(connectionStringName) 
    { } 
} 
+0

這可能是一個有效的評論,但它不是我的問題的答案。請轉到評論。 「回答」與非答案阻止他人回答。 – Faust

+0

最後一段回答你的問題。其餘的只是解釋你爲什麼做錯了。這就是你首先問這個問題的原因,不是嗎?要學會如何正確地做... –

+0

另外如果「提供的託管要求在分段和生產中使用相同的代碼庫,包括連接字符串」(如在本文中:http://stackoverflow.com/questions/7434753/switch-connection-strings-based-on-environment-with-ef-4-1-dbcontext) – Faust

0

假設您正在使用工作單元模式;這意味着您的對象上下文會在每個工作單元完成後重新創建。 您可能有一個類,它繼承自某種對象上下文,因此在用於創建該上下文的構造函數中,您可以引用允許傳遞連接字符串的基礎構造函數。 從那裏,你可以調用一個靜態方法或新建一個對象來處理創建連接字符串或傳遞實體連接。

如果您使用的是DbContext,它是一樣的,只有DbConnection而不是EntityConnection