标签:取数 哲学 img 获取 template art 生成 table pre
总体介绍
参考文档:
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下不区分大小写。
基于数据库的vs2019的T4模版代码生成器(一)基于mysql数据库
标签:取数 哲学 img 获取 template art 生成 table pre
原文地址:https://www.cnblogs.com/xiewenyu/p/13111772.html