T4模板读取Web.comfig配置文件

引用:System.Web.Configuration,如:
<#@ Assembly Name="System.Web" #>
<#@ Import Namespace="System.Web.Configuration" #>

读取web.config配置的数据库连接字符串代码:

string projPath=Host.ResolveAssemblyReference("$(ProjectDir)");
string projPathSubstr=projPath.Substring(0,projPath.IndexOf("Common"));
string path = Path.Combine(projPathSubstr,"XFK.LYTravel.LYTravelApi");  
VirtualDirectoryMapping vdm = new VirtualDirectoryMapping(path, true);  
WebConfigurationFileMap wcfm = new WebConfigurationFileMap();  
wcfm.VirtualDirectories.Add("/", vdm);  
System.Configuration.Configuration config = System.Web.Configuration.WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/");  
ConnectionStringsSection connSection = (ConnectionStringsSection)config.GetSection("connectionStrings");  
var connectionString=connSection.ConnectionStrings["constringSlaveQuery"].ConnectionString;

全部代码:

<#@ template debug="True" hostspecific="True" language="C#" #>
<#@ Include File="MultipleOutputHelper.ttinclude" #>
<#@ Assembly Name="$(TargetDir)NLite.dll" #>
<#@ Assembly Name="$(TargetDir)ELinq.dll" #>
<#@ Assembly Name="System.Data" #>
<#@ Assembly Name="System.Web" #>
<#@ Import Namespace="System.Web.Configuration" #>
<#@ Import Namespace="NLite.Data" #>
<#@ Import Namespace="NLite.Data.CodeGeneration" #>
<#@ output extension=".cs" #>
<#
    //System.Diagnostics.Debugger.Launch();
	var manager = Manager.Create(Host, GenerationEnvironment);
    var namespace1 = manager.DefaultProjectNamespace;
    var connectionStringName = "constringSlaveQuery";
    var dbContextName = Host.TemplateFile.Split('\\')[Host.TemplateFile.Split('\\').Length - 1].TrimEnd('.', 't');
	//获取项目下的文件夹生成Cs的命名空间
	var folders = Host.TemplateFile
							.Substring(Host.TemplateFile.LastIndexOf(namespace1)+namespace1.Length)
							.Replace(dbContextName+".tt","")
							.TrimEnd('\\');

    string projPath=Host.ResolveAssemblyReference("$(ProjectDir)");
    string projPathSubstr=projPath.Substring(0,projPath.IndexOf("Common"));
    string path = Path.Combine(projPathSubstr,"XFK.LYTravel.LYTravelApi");  
    VirtualDirectoryMapping vdm = new VirtualDirectoryMapping(path, true);  
    WebConfigurationFileMap wcfm = new WebConfigurationFileMap();  
    wcfm.VirtualDirectories.Add("/", vdm);  
    System.Configuration.Configuration config = System.Web.Configuration.WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/");  
    ConnectionStringsSection connSection = (ConnectionStringsSection)config.GetSection("connectionStrings");  

    var connectionString=connSection.ConnectionStrings["constringSlaveQuery"].ConnectionString;
	var dbProviderName = "System.Data.SqlClient";
	var dbConfiguration = DbConfiguration.Configure(connectionString,dbProviderName);
	var databaseSchema =dbConfiguration.Schema;
	
	//实体生成筛选器,只生成tab集合中有的表实体
	List<String> tab = new List<String>();
	tab.Add("Orders");
    tab.Add("ElongOrdersDetails");
	tab.Add("PaidXinfuCard");
	tab.Add("Users");
    tab.Add("UserModelContacts");
	tab.Add("TicketCityMapping");
    tab.Add("PICCOrder");
	tab.Add("UserContacts");
	tab.Add("JDContacts");
	tab.Add("JDPassengers");
    tab.Add("CertCardMapping");
    tab.Add("EnterpriseEmployee");
	manager.StartHeader();
#>
using System;
using System.Collections.Generic;
using System.Linq;
using NLite.Data;

namespace <#= namespace1 #><#= folders.Replace("\\",".") #>
{
<#
	manager.EndBlock();
#>
	using NLite.Reflection;

	public partial class <#= dbContextName #>:DbContext
	{
		//连接字符串名称:基于Config文件中连接字符串的配置
        const string connectionStringName = "<#= connectionStringName #>";

        //构造dbConfiguration 对象
        static DbConfiguration dbConfiguration;

		static <#= dbContextName #>()
		{
			 dbConfiguration = DbConfiguration
                  .Configure(connectionStringName)
                  .SetSqlLogger(() =>SqlLog.Debug)
				  .AddFromAssemblyOf<<#= dbContextName #>>(t=>t.HasAttribute<TableAttribute>(false))
				  ;
		}
		
		public <#= dbContextName #>():base(dbConfiguration){}
		
<#foreach (var tb in databaseSchema.Tables.Union(databaseSchema.Views)){
		if (tab!= null && tab.Count>0 && !tab.Contains(tb.TableName))
		{
			continue;
		}
#>
		public IDbSet<<#=NamingConversion.Default.ClassName(tb.TableName)  #>> <#= NamingConversion.Default.QueryableName(tb.TableName) #> { get; private set; }
<#}#>
	}
<#foreach (var tb in databaseSchema.Tables){
      if (tab!= null && tab.Count>0 && !tab.Contains(tb.TableName))
      {
		 continue;
      }
		manager.StartNewFile(NamingConversion.Default.ClassName(tb.TableName) + ".generated.cs");#>
	[Table("<#= tb.TableName #>")]
	public partial class <#= NamingConversion.Default.ClassName( tb.TableName) #> 
	{
<#foreach (var col in tb.PrimaryKeys){#>	
		[Id("<#= col.ColumnName#>",IsDbGenerated=<#= col.IsGenerated.ToString().ToLower() #>)]
		public <#= NamingConversion.Default.DataType(col) #> <#= NamingConversion.Default.PropertyName(col.ColumnName) #> { get;set; }
<#}#> 

<#  //循环生成列
foreach (var col in tb.Columns){#>
		[Column("<#= col.ColumnName#>",DbType = DBType.<#=col.DbType#>)]
		public <#= NamingConversion.Default.DataType(col) #> <#= NamingConversion.Default.PropertyName(col.ColumnName) #> { get;set; }
<#}#> 

<#
//循环生成关系表
foreach (var fk in tb.ForeignKeys){
	if (tab!= null && tab.Count>0 && !tab.Contains(fk.OtherTable.TableName))
	{
		continue;
	}
#>
		[ManyToOne(ThisKey="<#= NamingConversion.Default.PropertyName( fk.ThisKey.ColumnName) #>",OtherKey="<#= NamingConversion.Default.PropertyName(fk.OtherKey.ColumnName) #>")]
		public <#= NamingConversion.Default.ClassName(fk.OtherTable.TableName) #> <#= NamingConversion.Default.ManyToOneName(fk) #> { get;set; }
<#}#> 

<#
//循环生成关系表
foreach (var fk in tb.Children){
	if (tab!= null && tab.Count>0 && !tab.Contains(fk.OtherTable.TableName))
	{
		continue;
	}
#>
		[OneToMany(ThisKey="<#= NamingConversion.Default.PropertyName( fk.ThisKey.ColumnName) #>",OtherKey="<#= NamingConversion.Default.PropertyName(fk.OtherKey.ColumnName) #>")]
		public IList<<#= NamingConversion.Default.ClassName(fk.OtherTable.TableName) #>> <#= NamingConversion.Default.QueryableName(fk.OtherTable.TableName) #> { get;set; }
<#}#> 
	}
<# } manager.EndBlock();
 foreach (var tb in databaseSchema.Views){
	if(true) continue;
	 manager.StartNewFile(NamingConversion.Default.ClassName(tb.TableName) + ".generated.cs");#>
	[Table("<#= tb.TableName #>",Readonly=true)]
	public partial class <#= NamingConversion.Default.ClassName( tb.TableName) #> 
	{
<#foreach (var col in tb.Columns){#>
		[Column("<#= col.ColumnName#>")]
		public <#= col.Type.Name #> <#= NamingConversion.Default.PropertyName(col.ColumnName) #> { get;set; }
<#}#> 
	}
<# 
	} manager.EndBlock();
	manager.StartFooter();
#>
}
<#
 manager.EndBlock();
 manager.Process(true);
#>

参考:
http://blog.csdn.net/liyifei21/article/details/21087775
http://skybirdzw.blog.163.com/blog/static/725706262017723438407/

posted @ 2018-03-13 13:27  skybirdzw  阅读(593)  评论(0)    收藏  举报