t4模板指定生成路径

发布时间:2016-12-12 来源: 模板 点击:

篇一:使用T4模板批量生成代码

使用T4模板批量生成代码 什么是T4T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎。在 Visual Studio 中,“T4 文本模板”是由一些文本块和控制逻辑组成的混合模板,它可以生成文本文件。 在 Visual C# 或 Visual Basic 中,控制逻辑编写为程序代码的片段。生成的文件可以是任何类型的文本,例如网页、资源文件或任何语言的程序源代码。现在的VS中只要与代码生成相关的场景基本上都能找T4的身影,比如MVC的视图模板,Entity Framwork的DataContext模板等等。 什么是MultipleOutputHelper

标准的T4模板语法每个tt文件生成的类代码在同一文件,如果类很多,查看类代码就不方便了,MultipleOutputHelper是一个改进的tt文件代码,可用MultipleOutputHelper构建出输出多文件的T4解决方案,可在搜索引擎中搜索

“MultipleOutputHelper.ttinclude”获取代码。

复制文件

获取到代码将其保存为MultipleOutputHelper.ttinclude,将

MultipleOutputHelper.ttinclude复制到项目文件夹下,如项目文件夹下的WebApplication7目录下,并包含到项目中。

包含文件

新建文本模板TextTemplate1.tt,并包含MultipleOutputHelper.ttinclude文件: <#@includefile="$(SolutionDir)/WebApplication7/MultipleOutputHelper.ttinclude"#>

同时设置hostspecific="true":

<#@templatedebug="false"hostspecific="true"language="C#"#>

初始化

初始化 Manager对象:

<#var manager = Manager.Create(Host, GenerationEnvironment); #>

页眉

使用StartHeader (位于manager.StartNewFile之前)可这是生成文件页眉。 <# manager.StartHeader(); #>

// Header1

<# manager.EndBlock(); #>

定义输出文件

使用代码标识区分生成的代码块的范围,可重复多个。

manager.StartNewFile(tb_name+".cs");

//代码块

manager.EndBlock();

示例代码:

<# manager.StartNewFile("Class1.cs"); #>

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

namespace WebApplication7

{

public class Class1

{

public int MyProperty { get; set; }

} }

<# manager.EndBlock(); #>

页脚

使用StartFooter (位于manager.EndBlock之后)可这是生成文件页脚。 <# manager.StartFooter(); #>

// Footer1

<# manager.EndBlock(); #>

编译执行

使用Process方法,进行文件分割:

<# manager.Process(true);#>

生成文件截图

完整代码

以下是TextTemplate1.tt文件的完整代码:

<#@templatedebug="false"hostspecific="true"language="C#"#>

<#@assemblyname="System.Core"#>

<#@importnamespace="System.Linq"#> <#@importnamespace="System.Text"#>

<#@importnamespace="System.Collections.Generic"#>

<#@outputextension=".cs"#>

<#@includefile="$(SolutionDir)/WebApplication7/MultipleOutputHelper.ttinclude"#>

<#var manager = Manager.Create(Host, GenerationEnvironment); #>

<# manager.StartHeader(); #>

// Header1

<# manager.EndBlock(); #>

<# manager.StartNewFile("Class1.cs"); #>

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

namespace WebApplication7

{

public class Class1 {

public int MyProperty { get; set; }

}

}

<# manager.EndBlock(); #>

<# manager.StartFooter(); #>

// Footer2

<# manager.EndBlock(); #>

<# manager.StartHeader(); #>

// Header1

<# manager.EndBlock(); #>

<# manager.StartNewFile("Class2.cs"); #>

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

namespace WebApplication7

{

public class Class2 {

public int MyProperty { get; set; }

}

}

<# manager.EndBlock(); #>

<# manager.StartFooter(); #>

// Footer2

<# manager.EndBlock(); #>

<# manager.Process(true);#>

生成文件代码

以下是生成的Class1.cs文件完整代码:

// Header1

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

namespace WebApplication7

{

publicclassClass1

{

publicint MyProperty { get; set; }

}

}

// Footer2

篇二:T4模板根据DB生成实体类

T4模板根据DB生成实体类

阅读目录

1.前言

2.原理

3.oracle

4.Mssql

1.前言

为什么会有这篇文章了,最近看到了一些框架,里面要写的代码太多了,故此就想偷懒,要

是能写出一个T4模板,在数据库添加表后,根据模板就可以自动生成了类文件了,这样多

好,心动不如行动。记得使用T4模板还是2年前,那个时候听波波老师讲课做我们的最后

一个大项目CRM,简简单单的写了一下模板,保存一下,所有的类文件就出来了,当时那个

膜拜,油然而生。

同时在工作中,我们公司自己开发的一个ORM,实体类都要自己写,一个数据库表的字段

太多,写的真是手抽筋。如果你对T4基础语法不是很了解,可以参考我前面写的一篇文章 T4

语法快速入门。

回到顶部

2.原理

我们要做的事情是通过数据库表生成实体类。

第一步 我们要查询出当前用户下的所有数据库表。

第二步 查询出数据库表的结构,比如字段的名称,字段的类型,字段的长度大小,是否为

空等等。

工作中oracle用的比较多,在这里我就分析oracle和mssql

回到顶部

3.oracle

查询当前用户所有的表。

SELECT TABLE_NAME FROM USER_TABLES;

根据表名查询表结构数据

复制代码

SELECT A.column_name 字段名,

A.data_type数据类型,

A.data_length 长度,

A.data_precision 整数位,

A.Data_Scale 小数位,

A.nullable 允许空值,

A.Data_default缺省值,

B.comments 备注,

A.TABLE_NAME 表名

FROM user_tab_columns A, user_col_comments B

WHERE a.COLUMN_NAME = b.column_name

AND A.Table_Name = B.Table_Name

AND A.Table_Name = 'AFFIXINFO'

复制代码

ModelAuto.ttinclude来源与网上,作用是生成一个一个单独的类文件,即xx.cs文件。

ModelAuto.ttinclude

复制代码

<#@ template debug="true" hostspecific="true" language="C#" #>

<#@ output extension=".cs" #>

<#@ assembly name="System.Data" #>

<#@ assembly name="System.Data.OracleClient" #>

<#@ assembly name="System.Xml" #>

<#@ import namespace="System" #>

<#@ import namespace="System.Xml" #>

<#@ import namespace="System.Data" #>

<#@ import namespace="System.Data.OracleClient" #>

<#@ import namespace="System.Collections.Generic"#>

<#@ include file="ModelAuto.ttinclude"#>

<# var manager2 = new Manager(Host, GenerationEnvironment, true) { OutputPath =

Path.GetDirectoryName(Host.TemplateFile)}; #>

<#

ModelManager manager = new ModelManager();

List<string>

t4模板指定生成路径

list=manager.GetTableList();

#>

<#

foreach (var item in list)

{

string tableName=item;

DataTable table= manager.GetTableSchema(tableName);

#>

<#

manager2.StartBlock(tableName+".cs");

#>

using System;

using System.Data;

using System.Data.OracleClient;

namespace Model

{

/// <summary>

/// 数据表实体类:<#= tableName #>

/// </summary>

[Serializable()]

public class <#= tableName #>

{

<#

foreach(DataRow row in table.Rows)

{

#>

/// <summary>

/// <#=row["备注"]#>

/// </summary>

public <#= manager.TransFromSqlType(row["数据类型"].ToString())#> <#=row["字段名

"]#>{ get; set; }

<#}

#>

}

}

<# manager2.EndBlock(); #>

<#

}

#>

<# manager2.Process(true); #>

<#+

public class ModelManager

{

/// <summary>

/// 数据库连接字符串

/// </summary>

private const string CONNECTION_STRING = "Data Source=orcl;Persist Security

Info=True;User ID=jjmis;Password=jjmis;Unicode=True";

/// <summary>

/// 用户信息表名

/// </summary>

private const string PERSONINFO_TABLE_NAME = "USERINFO";

/// <summary>

/// 根据表名查询表结构信息

/// </summary>

private const string SELECT_SCHEMA_BY_TABLE_NAME = @"SELECT A.column_name

字段名,

A.data_type

数据类型,

A.data_length 长度,

A.data_precision 整数位,

A.Data_Scale

小数位,

A.nullable 允许空值,

A.Data_default缺省值,

B.comments 备注,

A.TABLE_NAME 表名

user_tab_columns A, user_col_comments B

a.COLUMN_NAME = b.column_name

A.Table_Name = B.Table_Name

A.Table_Name = '{0}'";

/// <summary>

/// 获得数据连接

/// </summary>

/// <returns></returns>

private OracleConnection GetConnection()

{

return new OracleConnection(CONNECTION_STRING);

}

/// <summary>

/// 得到当前用户的所有表名

/// </summary>

/// <returns></returns>

public List<string> GetTableList()

{

string sql = "SELECT * FROM USER_TABLES";

DataTable dt = OracleHelper.ExecuteDataTable(sql);

List<string> list = new List<string>();

if (dt!=null&&dt.Rows.Count>0)

{

for (int i = 0; i < dt.Rows.Count; i++)

{

list.Add(dt.Rows[i]["TABLE_NAME"].ToString());

}

}

return list; FROM WHERE AND AND

}

/// <summary>

/// 释放连接

/// </summary>

/// <param name="con"></param>

private void ReleaseConnection(OracleConnection con)

{

if (con != null)

{

if (con.State == ConnectionState.Open)

{

con.Close();

}

}

}

public DataTable GetTableSchema(string tableName)

{

DataTable dt;

using (OracleConnection con = GetConnection())

{

con.Open();

OracleCommand cmd = con.CreateCommand();

cmd.CommandText

string.Format(SELECT_SCHEMA_BY_TABLE_NAME,tableName);

cmd.CommandType = CommandType.Text;

OracleDataAdapter adapter = new OracleDataAdapter(cmd); DataSet ds = new DataSet();

adapter.Fill(ds);

dt = ds.Tables[0];

}

return dt;

}

/// <summary>

/// SQL[不完善,需要的自己改造]

/// </summary>

/// <param name="type"></param>

/// <returns></returns>

public string TransFromSqlType(string type)

{

if (string.IsNullOrEmpty(type)) =

篇三:Visual Studio下的代码生成-T4模板使用说明

Visual Studio下的代码生成: T4模板使用说明

在《基于T4的代码生成方式》中,我对T4模板的组成结构、语法,以及T4引擎的工作原理进行了大体的介绍,并且编写了一个T4模板实现了如何将一个XML转变成C#代码。为了让由此需求的读者对T4有更深的了解,我们通过T4来做一些更加实际的事情——SQL Generator。在这里,我们可以通过SQL Generator为某个数据表自动生成进行插入、修改和删除的存储过程。[文中源代码从这里下载]

一、代码生成器的最终使用效果

我们首先来看看通过直接适用我们基于T4的SQL生成模板达到的效果。右图(点击看大图)是VS2010的Solution Explorer,在Script目录下面,我定义了三个后缀名为.tt的T4模板。它们实际上是基于同一个数据表(T_PRODUCT)的三个存储过程的生成创建的模板文件,其中P_PRODUCT_D.tt、P_PRODUCT_I.tt和P_PRODUCT_D.tt分别用于记录的删除、插入和修改。自动生成的扩展名为.sql的同名附属文件就是相应的存储过程。

基于三种不同的数据操作(Insert、Update和Delete),我创建了3个重用的、与具体数据表无关的模板: InsertProcedureTemplate、UpdateProcedureTemplate和DeleteProcedureTemplate。这样做的目的为为了实现最大的重用,如果我们需要为某个数据表创建相应的存储过程的时候,我们可以直接使用它们传入相应的数据表名就可以了。实际上,P_PRODUCT_D.tt、P_PRODUCT_I.tt和P_PRODUCT_D.tt这三个T4模板的结构很简单,它们通过<#@include>指令将定义着相应ProcedureTemplate的T4模板文件包含进来。最

终的存储过程脚本通过调用ProcudureTempalte的Render方法生成。其中构造函数的参数表示的分别是连接字符串名称(在配置文件中定义)和数据表的名称。

<#@ template language="C#" hostspecific="True" #>

<#@ output extension="sql" #>

<#@ include file="T4Toolbox.tt" #>

<#@ include file="..\Templates\DeleteProcedureTemplate.tt" #>

<#

new DeleteProcedureTemplate("TestDb","T_PRODUCT").Render();

#>

<#@ template language="C#" hostspecific="True" #>

<#@ output extension="sql" #>

<#@ include file="T4Toolbox.tt" #>

<#@ include file="..\Templates\InsertProcedureTemplate.tt" #>

<#

new InsertProcedureTemplate("TestDb","T_PRODUCT").Render();

#>

<#@ template language="C#" hostspecific="True" #>

<#@ output extension="sql" #>

<#@ include file="T4Toolbox.tt" #>

<#@ include file="..\Templates\UpdateProcedureTemplate.tt" #>

<#

new UpdateProcedureTemplate("TestDb","T_PRODUCT").Render();

#>

二、安装T4工具箱(ToolBox)和编辑器

VS本身只提供一套基于T4引擎的代码生成的执行环境,为了利于你的编程你可以安装一些辅助性的东西。T4 ToolBox是一个CodePlex上开源的工具,它包含一些可以直接使用的代码生成器,比如Enum SQL View、AzMan wrapper、LINQ to SQL classes、LINQ to SQL schema和Entity Framework DAL等。T4 ToolBox还提供一些基于T4方面的VS的扩展。当你按照之后,在“Add New Item”对话框中就会多出一个命名为“Code Generation”的类别,其中包括若干文件模板。下面提供的T4模板的编辑工作依赖于这个工具。

为了提高编程体验,比如智

能感知以及代码配色,我们还可以安装一些第三方的T4编辑器。我使用的是一个叫做Oleg Sych的T4 Editor。它具有免费版本和需要付费的专业版本,当然我使用的免费的那款。成功按装了,它也会在Add New Item”对话框中提供相应的基于T4 的文件模板。

三、创建数据表

T4模板就是输入和输出的一个适配器,这与XSLT的作用比较类似。对于我们将要实现的SQL Generator来说,输入的是数据表的结构(Schema)输出的是最终生成的存储过程的SQL脚本。对于数据表的定义,不同的项目具有不同标准。我采用的是我们自己的数据库标准定义的数据表:T_PRODUCT(表示产品信息),下面是创建表的脚本。

CREATE TABLE [dbo].[T_PRODUCT](

[ID] [VARCHAR](50) NOT NULL,

[NAME] [NVARCHAR] NOT NULL,

[PRICE] [float] NOT NULL,

[TOTAL_PRICE] [FLOAT] NOT NULL,

[DESC] [NVARCHAR] NULL,

[CREATED_BY] [VARCHAR](50) NULL,

[CREATED_ON] [DATETIME] NULL,

[LAST_UPDATED_BY][VARCHAR](50) NULL,

[LAST_UPDATED_ON][DATETIME] NULL,

[VERSION_NO] [TIMESTAMP] NULL,

[TRANSACTION_ID] [VARCHAR](50) NULL,

CONSTRAINT [PK_T_PRODUCT] PRIMARY KEY CLUSTERED( [ID] ASC)ON [PRIMARY])

每一个表中有6个公共的字段:CREATED_BY、CREATED_ON、LAST_UPDATED_BY、LAST_UPDATED_ON、VERSION_NO和TRANSACTION_ID分别表示记录的创建者、创建时间、最新更新者、最新更新时间、版本号(并发控制)和事务ID。

四、创建抽象的模板:ProcedureTemplate

我们需要为三不同的数据操作得存储过程定义不同的模板,但是对于这三种存储过程的SQL结构都是一样的,基本结果可以通过下面的SQL脚本表示。

IF OBJECT_ID( '<<ProcedureName>>', 'P' ) IS NOT NULL

DROP PROCEDURE <<ProcedureName>>

GO

CREATE PROCEDURE <<ProcedureName>>

(

<<ParameterList>>

)

AS

<<ProcedureBody>>

GO

为此我定义了一个抽象的模板:ProcedureTemplate。为了表示CUD三种不同的操作,我通过T4模板的“类特性块”(Class Feature Block)定义了如下一个OperationKind的枚举。

<#+

public enum OperationKind

{

Insert,

Update,

Delete

}

#>

然后下面就是整个ProcedureTemplate的定义了。ProcedureTemplate直接继承自T4Toolbox.Template(来源于T4 ToolBox,它继承自TextTransformation)。ProcedureTemplate通过SMO(SQL Server Management Object)获取数据表的结构(Schema)信息,所以我们需要应用SMO相关的程序集和导入相关命名空间。

ProcedureTemplate具有三个属性DatabaseName(表示连接字符串名称)、Table(SMO中表示数据表)和OperationKind(表示具体的CUD操作的一种),它们均通过构造函数初始化。

<#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #>

<#@ assembly name="Microsoft.SqlServer.Smo" #>

<#@ assembly name="Microsoft.SqlServer.Management.Sdk.Sfc" #>

<#@ import namespace="System" #>

<#@ import namespace="Microsoft.SqlServer.Management.Smo" #>

<#+

public abstract class ProcedureTemplate : Template

{

public string DatabaseName {get; private set;}

public OperationKind OperationKind {get; private set;}

public Table Table {get; private set;}

public const string VersionNoField = "VERSION_NO";

public const string VersionNoParameterName = "@p_version_no";

public ProcedureTemplate(string databaseName, string tableName,OperationKind operationKind)

{

Guard.ArgumentNotNullOrEmpty(databaseName,"databaseName");

Guard.ArgumentNotNullOrEmpty(tableName,"tableName");

this.DatabaseName = databaseName;

this.OperationKind = operationKind;

Server server= new Server();

Database database = new Database(server, DatabaseName);

this.Table= new Table(database, tableName);

this.Table.Refresh();

}

public virtual string GetProcedureName()

{

switch(this.OperationKind)

{

case OperationKind.Insert: return "P_" +this.Table.Name.Remove(0,2) + "_I"; case OperationKind.Update: return "P_" +this.Table.Name.Remove(0,2) + "_U"; default: return "P_" +this.Table.Name.Remove(0,2) + "_D";

}

}

protected virtual string GetParameterName(string columnName)

{

相关热词搜索:路径 生成 指定 模板 t4 t4模板生成实体类 vs2013 t4模板 t4模板使用

版权所有 小龙文挡网 www.xltkwj.com