ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 使用T4为数据库自动生成实体类(C#)

使用T4为数据库自动生成实体类(C#)

原创 Linux操作系统 作者:iDotNetSpace 时间:2009-07-20 14:51:08 0 删除 编辑

使用T4为数据库自动生成实体类(C#)

2009-07-19 18:23 by 心利, 1244 visits, 网摘编辑


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

下载示例代码 

 Hello World ”代码生成器

创建一个C# Console工程,添加一个名为“HelloWorld.tt”的文本文件。

如果你正在使用Visual Studio 2005你需要安装 DSL Tools

HelloWorld.tt中添加以下内容

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

//

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

// the next time this code is regenerated.

//

using System;  

 public class <#= this.ClassName #>

{

   public static void HelloPot()

   {

      Console.WriteLine("Hello World");

   }

}

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


// 

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

// the next time this code is regenerated.

// 

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

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

<#

    this.ClassName = "HelloWorld1";

#>

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

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


// 

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

// the next time this code is regenerated.

// 

using System;   

 

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

}

 

二 数据库自动生成实体类

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

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

<#@ template language="C#debug="Truehostspecific="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" #>

获取数据库表结构

<#

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

           SqlConnection conn = newSqlConnection(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();
我们通过GetSchema("TABLES")获取了数据库中所有表的表名,接着通过表名,获取相应表的表结构。

生成代码

<#@ template language="C#debug="Truehostspecific="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 = newSqlConnection(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[0].Columns)

                  {    #>                    

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

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

                  {

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

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

                  }                                                

              <# }  #>         

           }                  

           <# 

           } #>                

}


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-609717/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    2376
  • 访问量
    5297318