2010-02-19 45 views
2

我在爲Visual Studio 2010 RC中的「DDL生成模板選項」(模型優先)過程創建一個T4模板。是否有可能檢索與該進程關聯的連接字符串?如果我右鍵單擊.edmx文件並選擇「從模型生成數據庫...」,我可以選擇數據連接。該連接字符串保存到app.config(假設選中該選項)。所以我想知道是否有可能在T4模板中檢索連接字符串。我想根據連接字符串從模板生成不同的信息。可以在VS2010中檢索DDL生成模板中的連接字符串嗎?

更一般地說,在這種情況下是否有可能獲取任何上下文信息?到目前爲止,我成功檢索的唯一東西是.NET數據提供者名稱。

注 - 我已經研究過Craig提供的想法,但只能得到IDE(devenv.exe)的名稱,這很可能意味着我只是在做錯事。

回答

1

那麼,EF連接字符串將始終與模型具有相同的名稱,對吧?數據庫連接字符串將嵌入到EF連接字符串中。所以我會說你應該能夠通過EF連接字符串至少間接地獲得它。

因爲你沒有在程序集中運行,所以必須指定配置文件名。

因此,這將是這樣的:

var config = ConfigurationManager.OpenExeConfiguration(name); 
var cs = config.ConnectoinStrings[modelName]; 

注意name,在這裏,應該是一個EXE文件的名稱。但在IDE中,您的配置文件將被稱爲App.config而不是MyApp.dll.config。所以你可能需要玩弄這個才能使它工作 - 嘗試使用「App」作爲EXE名字!

最壞的情況是打開它作爲一個文件,然後使用配置管理器。

+0

,我相信這是正確的。但是我還沒有足夠的智慧來弄清楚如何獲得EF連接字符串。我已經在模板中的調試器中檢查了所有可以找到的所有內容,試圖找到沒有成功的文檔,並查看了RC附帶的模板。我要麼是盲目的,要麼是什麼。你有獲得EF連接字符串的提示嗎? – 2010-02-19 16:25:06

+0

我會更新答案。 – 2010-02-19 16:31:18

+0

這似乎是正確的方法,所以我正在對它進行評估。但是,我仍然陷入困境,目前還不得不從事其他一些工作。當前正在運行的應用程序是devenv.exe,所以我沒有運行到該項目的app.config。鏈接必須存在,所以我會在以後繼續探索。 – 2010-02-19 18:23:19

3

我在MSDN論壇上發佈了我的問題,並得到了來自Lingzhi Sun的回覆,他指出我在skysanders.net上的幾個鏈接的方向。其中的第二個鏈接有一個非常好的例子,可以查看app/web.config文件,特別是我想要的部分,即連接字符串。它沒有提供關於原始問題中描述的場景的特定連接字符串的任何信息,但這足以讓我足夠接近。

4

如果這可以幫助其他人,這裏是我創建的讀取裏面T4實體框架的連接字符串的一個片段。您將模型名稱(也是連接字符串的名稱)傳遞給它。它發現並解析我需要的連接位。當它不成功時它也會引發有用的錯誤。

要使用:

A.在模板的頂部粘貼此,如果您還沒有引用這些組件:

<#@ assembly name="EnvDTE" #> 
<#@ assembly name="System.Configuration" #> 

B.在您的模板結束這個醜陋的(但緊湊)的代碼粘貼:

<#+ 
string GetEFConnectionString(string modelName) 
{ 
    string file = null, key = "provider connection string=\""; 
    foreach (EnvDTE.ProjectItem item in ((EnvDTE.Project)((Array)((EnvDTE.DTE)((IServiceProvider)this.Host).GetService(typeof(EnvDTE.DTE))).ActiveSolutionProjects).GetValue(0)).ProjectItems) 
     if (System.Text.RegularExpressions.Regex.IsMatch(item.Name, "(app|web).config", System.Text.RegularExpressions.RegexOptions.IgnoreCase)) { 
      file = item.get_FileNames(0); break; 
     } 
    if (file == null) throw new Exception("config file could not be found"); 
    var config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(new System.Configuration.ExeConfigurationFileMap() { ExeConfigFilename = file }, System.Configuration.ConfigurationUserLevel.None); 
    var cn = config.ConnectionStrings.ConnectionStrings[modelName]; 
    if (cn == null) throw new Exception(modelName + " connection string could not be found"); 
    string s = cn.ConnectionString;  
    int pos = s.IndexOf(key,StringComparison.OrdinalIgnoreCase);  
    if (pos<0) throw new Exception("could not find value '" + key + "' inside connection string"); 
    pos += key.Length; 
    int pos2=s.IndexOf('"',pos); 
    if (pos2 < 0) throw new Exception("could not find ending \" in connection string"); 
    return s.Substring(pos,pos2-pos); 
} 
#> 

下使用它像這樣:

using(var connection = new SqlConnection(GetEFConnectionString("Database"))) { 
    .. 
}  
+0

這實際上非常有幫助。謝謝! :) – 2013-01-28 20:01:11

相關問題