lightlanguage 2020-06-13
总体介绍
参考文档:
https://www.cnblogs.com/laozhang-is-phi/p/9757999.html
只想用 ADO.NET 搭建多层框架,动软代码生成器是一个不错的选择。
T4 (Text Template Transformation Toolkit) 是微软官方在 VisualStudio 2008+ 中开始使用的代码生成引擎。在 Visual Studio 中,“T4 文本模板”是由一些文本块和控制逻辑组成的混合模板,它可以生成文本文件。 在 Visual C# 或 Visual Basic 中,控制逻辑编写为程序代码的片段。生成的文件可以是任何类型的文本,例如网页、资源文件或任何语言的程序源代码。现在的VS中只要与代码生成相关的场景基本上都能找T4的身影,比如MVC的视图模板,Entity Framwork的DataContext模板等等。
这里就不具体讲解 T4 语法了,大家可以自行学习,其实很简单,主要还是 C# 代码,下边你看过之后就能懂了,咱们首先先实现之前留下的一个伏笔 —— 将我们的数据库表利用T4 模板生成实体类,也就是 DbFirst。
1 首先在我们的项目中,新建一个类库 Xwy.Core.FrameWorkT4Mysql
2 在该类库下,新建文件夹 Xwy.Core.FrameWorkT4Mysql.Entity,用于单独存放我们的模板以及生成的实体类文件
3 ModelAuto.ttinclude 文本文件代码
4 MysqlHelper.ttinclude文本文件
5 模板文件Entity.tt
//如果要获取主机信息,记得把 hostspecific 设置成true <#@ template debug="false" hostspecific="True" language="C#" #> <#@ output extension=".cs" #> //导入命名空间组件 <#@ assembly name="System.Data" #> <#@ assembly name="System.xml" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="System.Data.SqlClient" #> <#@ import namespace="System.Data" #> <#@ assembly name="System.Core.dll" #> <#@ assembly name="System.Data.DataSetExtensions.dll" #> <#@ import namespace="System" #> <#@ import namespace="System.Xml" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="System.IO" #> //引入我们的公共模板文件 <#@ include file="$(ProjectDir)DbHelper.ttinclude" #> <#@ include file="$(ProjectDir)ModelAuto.ttinclude" #> //定义我们的输出文件夹 <# var OutputPath1 = Path.GetDirectoryName(Host.TemplateFile)+"\\work"; if (!Directory.Exists(OutputPath1)) { Directory.CreateDirectory(OutputPath1); } var manager = new Manager(Host, GenerationEnvironment, true) { OutputPath = OutputPath1 }; #> //-------------------------------------------------------------------- // 此代码由T4模板自动生成 // 老张的哲学 生成时间 <#=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")#> // 注意更新后会改变相应代码。 //-------------------------------------------------------------------- <# var tableName=config.TableName;//获取config配置中的表名,为单一生产使用 #> <# if(tableName!=""){//如果表名有值,表示是生成单一文件 #> //引用命名空间 using System; namespace Blog.Core.FrameWork.Entity { /// <summary> /// <#=tableName#> /// </summary> public class <#=tableName#>//可以在这里加上基类等 { //将全部字段遍历出来 <# foreach(DbColumn column in DbHelper.GetDbColumns(config.ConnectionString, config.DbDatabase, config.TableName)){#> public <#= column.CSharpType#><# if(column.CommonType.IsValueType && column.IsNullable){#>?<#}#> <#=column.ColumnName#> { get; set; } <#}#> } } //如果为空,表示要将整个数据库都生成出来 <# } else{ #> //连接数据库,打开 connect 连接 <# SqlConnection conn = new SqlConnection(config.ConnectionString); conn.Open(); System.Data.DataTable schema = conn.GetSchema("TABLES"); #> //遍历全部数据库表 <# foreach(System.Data.DataRow row in schema.Rows) { #> //开始启动block块,参数是实体类文件名 <# manager.StartBlock(row["TABLE_NAME"]+".cs"); #> using System; namespace Blog.Core.FrameWork.Entity { /// <summary> /// <#=tableName#> /// </summary> public class <#=row["TABLE_NAME"].ToString()#>//可以在这里加上基类等 { //将该表下的字段都遍历出来,可以自定义获取数据描述等信息 <# foreach(DbColumn column in DbHelper.GetDbColumns(config.ConnectionString, config.DbDatabase, row["TABLE_NAME"].ToString() )){ #> public <#= column.CSharpType#><# if(column.CommonType.IsValueType && column.IsNullable){#>?<#}#> <#=column.ColumnName #> { get; set; } <#}#> } } <# manager.EndBlock(); } manager.Process(true); } #>
注意事项:
1、<#@ assembly name="C:\Users\youga\.nuget\packages\mysql.data\8.0.14\lib\net452\MySql.Data.dll" #> 修改为你的引用;
2、MySqlHelper.ttinclude 修改ConnectionString变量;
3、App.Entities.tt 修改connectionString变量;
4、可以根据自己的需求修改T4模板;
5、生成的类名都是小写,可否转化为帕斯卡命名规范(待解决);
6、如果MySQL要生成大写的话,需要在my.ini中添加 lower_case_table_names=2,让mysql区分大小写,生成出来的就跟所设置的表名,字段名一样了,默认mysql在windows下不区分大小写。