其他分享
首页 > 其他分享> > T4模版生成实体(三)

T4模版生成实体(三)

作者:互联网

5. 定义T4模版及所要的变量

5.1 创建实体模版

       右键添加新项,模版分为两种:文本模版,运行时文本模版

       文本模版是填入什么,立刻就会生成你最终需要的文件

     

在展开的文件下

显然这个不是我们需要的,因为我们的要动态由代码来生成的

 

 

这里我们创建运行时模版

二者其实差在属性配置,选定文件右键属性或按Alt+回车

找到自定义工具。运行时模版是 TextTemplatingFilePreprocessor,文本模版是 TextTemplatingFileGenerator,改成对应的,重新保存一下,文件生成的就是对应的cs或txt了。

 

这里贴一下实体的模版

<#@ template language="C#" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Linq" #>
using System;
using System.ComponentModel.DataAnnotations.Schema;
<# if(BaseClassName == "Entity"){ #>
using Abp.Domain.Entities;
<# } #>

namespace KevisEtc.Entitys.<#= DbName#>
{
	[Table("<#= tableInfo.TableName #>")]
	public class <#= tableInfo.TableName.Replace("tbl_","T_") #> : <#= BaseClassName #>
	{
		<#
			var arryBaseColumn = new string[]{ "Id", "Guid" ,"CreateTime", "CreaterGuid", "CreaterUser", "UpdateTime", "UpdaterGuid", "UpdaterUser" }; 
			foreach (var columnInfo in columnInfoList)
			{
			//因为继承了基类,所以一些字段不需要输出
			if(arryBaseColumn.Contains(columnInfo.ColumnName)){continue;}
		#>

		/// <summary>
        /// <#= columnInfo.ColumnComment #>
        /// </summary>
        [Column("<#= columnInfo.ColumnName #>")]
        public virtual <#= columnInfo.DataType #> <#= columnInfo.ColumnName #> { get; set; }
		<#
			}
		#>

	}
}

     看起来应该很熟悉,就像在视图里面编码一样。

这边用到了一些自定义的变量,例如 tableInfo,columnInfoList,DbName,BaseClassName等

这个我新建一个目录,在里面创建跟这个名称一样,多了一个Ext。 模版文件叫 Entity.tt,变量定义的文件叫 EntityExt.cs,然后这个类的名称要跟模版生成的类名一致,也就是分部类。

using KevisEtc.T4.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace KevisEtc.T4.ABP
{
    public partial class Entity
    {
        private string DbName = string.Empty;
        private TableInfo tableInfo;
        private List<ColumnInfo> columnInfoList;
        private string BaseClassName = string.Empty;
        public Entity(TableInfo tableInfo, List<ColumnInfo> columnInfo, string DbName)
        {
            this.tableInfo = tableInfo;
            this.columnInfoList = columnInfo;
            this.DbName = DbName;

            BaseClassName = columnInfo.Where(p => p.ColumnName == "CreateTime").Count() > 0 ? "BaseEntity" : "Entity";
        }
    }
}

这边构建了一下有参构造函数,一会通过外部进行调用赋值。

外部只需要调用

ABP.Entity e = new ABP.Entity(tableInfo, ColumnInfoList, DbName);
File.WriteAllText(filePath, e.TransformText());

这样模版就生成啦。下一篇分享外部的代码。

标签:tableInfo,模版,T4,System,生成,using,Entity,DbName
来源: https://blog.csdn.net/shua67/article/details/112004769