На случай, если это кому-нибудь поможет, вот фрагмент, который я создал для чтения строки подключения Entity Framework изнутри 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);
}
#>
C.Используйте это так:
using(var connection = new SqlConnection(GetEFConnectionString("Database"))) {
..
}