2010-02-19 29 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

相关问题