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/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端