基于数据库的vs2019的T4模版代码生成器(一)基于mysql数据库

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,用于单独存放我们的模板以及生成的实体类文件

基于数据库的vs2019的T4模版代码生成器(一)基于mysql数据库

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、基于数据库的vs2019的T4模版代码生成器(一)基于mysql数据库App.Entities.tt 修改connectionString变量;
4、可以根据自己的需求修改T4模板;
5、生成的类名都是小写,可否转化为帕斯卡命名规范(待解决); 

6、如果MySQL要生成大写的话,需要在my.ini中添加 lower_case_table_names=2,让mysql区分大小写,生成出来的就跟所设置的表名,字段名一样了,默认mysql在windows下不区分大小写。

相关推荐