T4 (Text Template Transformation Toolkit) 是一个基于模板的代码生成器。使用T4你可以通过写一些ASP.NET-like模板,来生成C#, T-SQL, XML等代码。

下载示例代码

一 “Hello World ”代码生成器

1 创建一个C# Console工程,添加一个名为“HelloWorld.tt”的文本文件,将<#@ output extension=".cs" #>设为".cs"便会生成cs文件。

2 向HelloWorld.tt中添加以下内容

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

// <autogenerated>

// This code was generated by a tool. Any changes made manually will be lost

// the next time this code is regenerated.

// </autogenerated>

usingSystem;

public class<#= this.ClassName #>

{

public static voidHelloPot()

{

Console.WriteLine("Hello World");

}

}

上面的模板将生成一个名为“HelloWorld”的类,当你保存HelloWorld.tt时,Visual Studio将为你生成以下代码:

// <autogenerated>

// This code was generated by a tool. Any changes made manually will be lost

// the next time this code is regenerated.

// </autogenerated>

using System;
public class HelloWorld
{
public static void HelloPot()
{
Console.WriteLine("Hello World");
}
}

3 添加另一个文本文件HelloWorld1.tt.,加入以下内容:

<#

this.ClassName = "HelloWorld1";

#>

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

通过修改ClassName的值可以更改类名,以上模板将生成一个名为HelloWorld1类。

// <autogenerated>

// This code was generated by a tool. Any changes made manually will be lost

// the next time this code is regenerated.

// </autogenerated>

using System;   

public class HelloWorld1
{
public static void HelloPot()
{
Console.WriteLine("Hello World");
} }

二 数据库自动生成实体类

这个实例会创建一个模板为数据库中的每一张表,自动创建相应的实体类。

1 首先我们需要添加一些程序集引用,命名空间。

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

<#@ 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" #>

2 获取数据库表结构.

<#

stringconnectionString = "data source=.""SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=MIAPortal;";

SqlConnection conn = newSqlConnection(connectionString);

conn.Open();

System.Data.DataTable schema = conn.GetSchema("TABLES");

stringselectQuery = "select * from @tableName";

SqlCommand command = newSqlCommand(selectQuery,conn);

SqlDataAdapter ad = newSqlDataAdapter(command);

System.Data.DataSet ds = newDataSet();

我们通过GetSchema("TABLES")获取了数据库中所有表的表名,接着通过表名,获取相应表的表结构。

3 生成代码如下

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

<#@ 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" #>

 using System;

namespace MyProject.Entities

{     

      <#

           string connectionString = "data source=.""SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=MIAPortal;";

           SqlConnection conn = new SqlConnection(connectionString);

           conn.Open();

           System.Data.DataTable schema = conn.GetSchema("TABLES");

           string selectQuery = "select * from @tableName";

           SqlCommand command = new SqlCommand(selectQuery,conn);

           SqlDataAdapter ad = new SqlDataAdapter(command);

           System.Data.DataSet ds = new DataSet();        

           foreach(System.Data.DataRow row in schema.Rows)

           {  #>  

           public class <#= row["TABLE_NAME"].ToString().Trim('s') #>                   

           {    <#                     

                   ds.Tables.Clear();

                  command.CommandText = selectQuery.Replace("@tableName",row["TABLE_NAME"].ToString());

                  ad.FillSchema(ds, SchemaType.Mapped, row["TABLE_NAME"].ToString());         

                  foreach (DataColumn dc in ds.Tables[].Columns)

                  {    #>                    

                  private <#= dc.DataType.Name #> _<#= dc.ColumnName.Replace(dc.ColumnName[].ToString(), dc.ColumnName[].ToString().ToLower())      #>;                      

                  public <#= dc.DataType.Name #> <#= dc.ColumnName #>

                  {

                     get { return _<#= dc.ColumnName.Replace(dc.ColumnName[].ToString(), dc.ColumnName[].ToString().ToLower()) #>; }

                     set { _<#= dc.ColumnName.Replace(dc.ColumnName[].ToString(), dc.ColumnName[].ToString().ToLower()) #> = value; }

                  }                                                

              <# }  #>         

           }                  

           <# 

           } #>                

}

使用T4为数据库自动生成实体类的更多相关文章

  1. Asp.Net Core如何根据数据库自动生成实体类

    通过引用Nuget包添加实体类 运行 Install-Package Microsoft.EntityFrameworkCore.SqlServer 运行 Install-Package Micros ...

  2. T4模板根据DB生成实体类

    1.前言 为什么会有这篇文章了,最近看到了一些框架,里面要写的代码太多了,故此就想偷懒,要是能写出一个T4模板,在数据库添加表后,根据模板就可以自动生成了类文件了,这样多好,心动不如行动.记得使用T4 ...

  3. MyEclipse数据库反向生成实体类

    MyEclipse数据库反向生成实体类 “计应134(实验班) 凌豪” 当我们在开发项目涉及到的表太多时,一个一个的写JAVA实体类很是费事.然而强大的MyEclipse为我们提供简便的方法:数据库反 ...

  4. J2EE进阶(十五)MyEclipse反向工程实现从数据库反向生成实体类之Hibernate方式

    J2EE进阶(十五)MyEclipse反向工程实现从数据库反向生成实体类之Hibernate方式   反向工程又称逆向工程.   开发项目涉及到的表太多,一个一个的写JAVA实体类很是费事.MyEcl ...

  5. Mybatis自动生成实体类

    Maven自动生成实体类需要的jar包 一.pom.xml中 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns ...

  6. 【.NetCore学习】ASP.NET Core EF Core2.0 DB First现有数据库自动生成实体Context

    主要参考微软官方文档 https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db Microsoft .NE ...

  7. Springboot mybatis generate 自动生成实体类和Mapper

    https://github.com/JasmineQian/SpringDemo_2019/tree/master/mybatis Springboot让java开发变得方便,Springboot中 ...

  8. Mybatis自动生成实体类、dao接口和mapping映射文件

    由于Mybatis是一种半自动的ORM框架,它的工作主要是配置mapping映射文件,为了减少手动书写映射文件,可以利用mybatis生成器,自动生成实体类.dao接口以及它的映射文件,然后直接拷贝到 ...

  9. .net core 中简单封装Dapper.Extensions 并使用sqlsuger自动生成实体类

    引言 由公司需要使用dapper  同时支持多数据库 又需要支持实体类 又需要支持sql 还需要支持事务 所以采用了 dapper + dapperExtensions  并配套 生成实体类小工具的方 ...

随机推荐

  1. 详解MyEclipse10 安装Spket 1.6.23(支持Extjs4.1.1及jQuery1.8)

    用MyEclipse10安装Spket主要有3种方式:在线下载更新.下载Zip覆盖.下载jar包安装.我用在线安装尝试了N次终于还是失败,只好下载jar包来安装,在失败了M次之后终于安装成功,现在网上 ...

  2. 从零开始学C++之虚函数与多态(二):纯虚函数、抽象类、虚析构函数

    一.纯虚函数 虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数 在基类中不能给出有意义 ...

  3. Linux下MySQL5.6的修改字符集编码为UTF8

    一.登录MySQL查看用SHOW VARIABLES LIKE 'character%';下字符集,显示如下: +--------------------------+---------------- ...

  4. 理解Web标准(网站标准)

    我觉得一名Web前端应该好好理解Web标准到底是什么,为什么要在我们的实际实践中遵循Web标准. 什么是Web标准.百度百科的解释是: WEB标准不是某一个标准,而是一系列标准的集合.网页主要由三部分 ...

  5. JSON初探

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...

  6. TXT EXPLORER

    EXE程序:http://files.cnblogs.com/xe2011/RELEASE_TXTExplorer2014-08-25-165323.rar c# 源码:http://files.cn ...

  7. JS可以做什么,它的能力范围 View----------Request/Submit------------------Server

    View----------Request/Submit------------------Server javascript--------><script>标签方式(页面,动态插 ...

  8. 深入了解android平台的jni---本地多线程调用java代码

    一.jni调用java对象     JNI提供的功能之一是在本地代码中使用Java对象.包括:创建一个java类对象和通过函数传递一个java对象.创建一个java类对象,首先需要得到得到使用Find ...

  9. Android横竖屏切换及其相应布局载入问题

    第一.横竖屏切换连带载入多屏布局问题: 假设要让软件在横竖屏之间切换.因为横竖屏的高宽会发生转换,有可能会要求不同的布局. 能够通过下面两种方法来切换布局: 1)在res文件夹下建立layout-la ...

  10. 【windows socket+TCPserverclient】

    Windows Socket+TCPserverclient      Winsock是 Windows下套接字标准.          Socket套接字基于计算机网络,提供同一系统上不同进程或由局 ...