我正在为Visual Studio 2010 RC中的“DDL生成模板选项”(模型优先)过程创建T4模板。是否可以检索与该进程关联的连接字符串?如果我右键单击.edmx文件并选择“从模型生成数据库...”,我可以选择数据连接。该连接字符串将保存到app.config(假设选中该选项)。所以我想知道是否有可能在T4模板中检索该连接字符串。我想根据连接字符串从模板生成不同的信息。
更一般地说,在这种情况下是否可以获得任何上下文信息?到目前为止,我唯一成功检索的是.NET数据提供程序名称。
注意 - 我已经研究了Craig提供的想法,但我只得到了IDE(devenv.exe)的名称,这很可能意味着我只是做错了。
答案 0 :(得分:4)
如果这有助于其他人,这里是我创建的一个片段,用于从T4内部读取Entity Framework连接字符串。您传递模型名称(也是连接字符串的名称)。它找到并解析我需要的连接位。当它没有成功时,它也会抛出有用的错误。
使用:
一个。如果您尚未引用这些程序集,请将其粘贴到模板顶部:
<#@ 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"))) {
..
}
答案 1 :(得分:3)
我在一个MSDN论坛上发布了我的问题,并得到了Lingzhi Sun的回复,他在skysanders.net指向了几个链接的方向。这些链接中的第二个有一个非常好的例子,可以访问app / web.config文件,特别是我想要的部分,连接字符串。它没有提供有关我在原始问题中描述的场景的特定连接字符串的任何信息,但这让我足够接近。
答案 2 :(得分:1)
那么,EF连接字符串将始终与模型具有相同的名称,对吧?数据库连接字符串将嵌入EF连接字符串中。所以我说你应该能够通过EF连接字符串获得它,至少是间接的。
因为您没有在程序集中运行,所以必须指定配置文件名。
所以它会是这样的:
var config = ConfigurationManager.OpenExeConfiguration(name);
var cs = config.ConnectoinStrings[modelName];
请注意,此处的name
应该是EXE名称。但是在IDE中,您的配置将被称为App.config
而不是MyApp.dll.config
。因此,您可能需要使用它来使其工作 - 尝试使用“App”作为EXE名称!
最坏的情况是将其作为文件打开,然后使用配置管理器。