zoukankan      html  css  js  c++  java
  • 使用T4为数据库自动生成实体类

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

    下载示例代码

     Hello World ”代码生成器

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

    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");
       }
    }

    添加另一个文本文件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");
       }
    
    }
    View Code

    二 数据库自动生成实体类

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

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

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

    获取数据库表结构

    <#

    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")获取了数据库中所有表的表名,接着通过表名,获取相应表的表结构。

     

    生成代码如下

    <#@ 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[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; }
    
                      }                                                
    
                  <# }  #>         
    
               }                  
    
               <# 
    
               } #>                
    
    }
    View Code

     

     

  • 相关阅读:
    MS CRM 2011 RC中的新特性(4)——活动方面之批量编辑、自定义活动
    最近的一些有关MS CRM 2011的更新
    MS CRM 2011 RC中的新特性(6)——连接
    MS CRM 2011 RC中的新特性(7)—仪表板
    参加MS CRM2011深度培训课程——第一天
    MS CRM 2011插件调试工具
    MS CRM2011实体介绍(四)——目标管理方面的实体
    MS CRM 2011 RC中的新特性(3)——客户服务管理方面
    MS CRM 2011 RC中的新特性(8)—数据管理
    ExtAspNet 登陆
  • 原文地址:https://www.cnblogs.com/panshirui/p/3342723.html
Copyright © 2011-2022 走看看