新建类库,右键添加 "文本模板"

添加完成之后生成如下后缀为 tt的文件:

双击文件:TextTemplate_Test.tt 文件打开,替换代码如下

  1. <#@ template debug="false" hostspecific="true" language="C#" #>
  2. <#@ assembly name="System.Core" #>
  3. <#@ assembly name="System.Data" #>
  4. <#@ assembly name="System.xml" #>
  5. <#@ import namespace="System.Linq" #>
  6. <#@ import namespace="System.Text" #>
  7. <#@ import namespace="System.Collections.Generic" #>
  8. <#@ import namespace="System.Data.SqlClient" #>
  9. <#@ import namespace="System.Data" #>
  10. <#@ include file="ModelAuto.ttinclude"#>
  11. <#@ output extension=".cs" #>
  12.  
  13. <# var manager = new Manager(Host, GenerationEnvironment, true) { OutputPath = Path.GetDirectoryName(Host.TemplateFile)}; #>
  14. <#
  15. //数据库连接
  16. string connectionString ="Data Source=127.0.0.1;Initial Catalog=TestDB;User ID=sa;Password=123456;";
  17. SqlConnection conn = new SqlConnection(connectionString);
  18. conn.Open();
  19. //查询表
  20. System.Data.DataTable schema = conn.GetSchema("TABLES");
  21. string selectQuery = "select * from @tableName"; //查询表语句
  22. SqlCommand command = new SqlCommand(selectQuery,conn);
  23. SqlDataAdapter ad = new SqlDataAdapter(command);
  24. System.Data.DataSet ds = new DataSet();
  25. //查询字段
  26. string propQuery = "SELECT 表名=sobj.name,字段名=scol.name,字段说明=sprop.[value] FROM syscolumns as scol inner join sys.sysobjects as sobj on scol.id=sobj.id and sobj.xtype='U' and sobj.name<>'dtproperties' left join sys.extended_properties as sprop on scol.id=sprop.major_id and scol.colid=sprop.minor_id where sobj.name='@tableName' and scol.name='@columnName'";
  27. SqlCommand command2 = new SqlCommand(propQuery,conn);
  28. SqlDataAdapter ad2 = new SqlDataAdapter(command2);
  29. System.Data.DataSet ds2 = new DataSet();
  30. #>
  31.  
  32. <# foreach(System.Data.DataRow row in schema.Rows) { #>
  33. <# manager.StartBlock(row["TABLE_NAME"].ToString()+".cs"); #>
  34. using System;
  35.  
  36. namespace Entity.Model
  37. {
  38. /// <summary>
  39. /// 实体类:<#= row["TABLE_NAME"].ToString() #>
  40. /// </summary>
  41. [Serializable]
  42. public class <#= row["TABLE_NAME"].ToString() #>
  43. {
  44. <#
  45. ds.Tables.Clear();
  46. command.CommandText = selectQuery.Replace("@tableName","["+row["TABLE_NAME"].ToString()+"]");
  47. ad.FillSchema(ds, SchemaType.Mapped, row["TABLE_NAME"].ToString());
  48. foreach (DataColumn dc in ds.Tables[].Columns)
  49. {
  50. #>
  51. <#
  52. ds2.Tables.Clear();
  53. command2.CommandText = propQuery.Replace("@tableName",row["TABLE_NAME"].ToString());
  54. command2.CommandText = command2.CommandText.Replace("@columnName",dc.ColumnName);
  55. ad2.Fill(ds2);
  56. #>
  57.  
  58. ///<summary>
  59. ///<#= manager.TransFromSqlType(dc.DataType.Name) #>:<#=ds2.Tables[0].Rows[0].ItemArray[2]#>
  60. ///</summary>
  61. public <#= manager.TransFromSqlType(dc.DataType.Name) #> <#= dc.ColumnName #> { get; set; }
  62. <#}#>
  63. }
  64. }
  65.  
  66. <# manager.EndBlock(); #>
  67.  
  68. <#}#>
  69.  
  70. <#manager.Process(true);#>

需要更换几个配置的地方:

1,设置数据库连接,找到该段代码:string connectionString ="Data Source=127.0.0.1;Initial Catalog=TestDB;User ID=sa;Password=123456;";  替换你要连接的数据库即可;

2,设置命名空间,找到代码:namespace Entity.Model {....} ,将该处的命名空间替换你要的即可;

3,相同目录下添加代码自动生成逻辑文件,文件名字为:ModelAuto.ttinclude

文件内容如下,

  1. <#@ assembly name="System.Core"#>
  2. <#@ assembly name="EnvDTE"#>
  3. <#@ import namespace="System.Collections.Generic"#>
  4. <#@ import namespace="System.IO"#>
  5. <#@ import namespace="System.Text"#>
  6. <#@ import namespace="Microsoft.VisualStudio.TextTemplating"#>
  7.  
  8. <#+
  9.  
  10. class Manager
  11. {
  12. public struct Block {
  13. public String Name;
  14. public int Start, Length;
  15. }
  16.  
  17. public List<Block> blocks = new List<Block>();
  18. public Block currentBlock;
  19. public Block footerBlock = new Block();
  20. public Block headerBlock = new Block();
  21. public ITextTemplatingEngineHost host;
  22. public ManagementStrategy strategy;
  23. public StringBuilder template;
  24. public String OutputPath { get; set; }
  25.  
  26. public Manager(ITextTemplatingEngineHost host, StringBuilder template, bool commonHeader) {
  27. this.host = host;
  28. this.template = template;
  29. OutputPath = String.Empty;
  30. strategy = ManagementStrategy.Create(host);
  31. }
  32.  
  33. public void StartBlock(String name) {
  34. currentBlock = new Block { Name = name, Start = template.Length };
  35. }
  36.  
  37. public void StartFooter() {
  38. footerBlock.Start = template.Length;
  39. }
  40.  
  41. public void EndFooter() {
  42. footerBlock.Length = template.Length - footerBlock.Start;
  43. }
  44.  
  45. public void StartHeader() {
  46. headerBlock.Start = template.Length;
  47. }
  48.  
  49. public void EndHeader() {
  50. headerBlock.Length = template.Length - headerBlock.Start;
  51. }
  52.  
  53. public void EndBlock() {
  54. currentBlock.Length = template.Length - currentBlock.Start;
  55. blocks.Add(currentBlock);
  56. }
  57.  
  58. public void Process(bool split) {
  59. String header = template.ToString(headerBlock.Start, headerBlock.Length);
  60. String footer = template.ToString(footerBlock.Start, footerBlock.Length);
  61. blocks.Reverse();
  62. foreach(Block block in blocks) {
  63. String fileName = Path.Combine(OutputPath, block.Name);
  64. if (split) {
  65. String content = header + template.ToString(block.Start, block.Length) + footer;
  66. strategy.CreateFile(fileName, content);
  67. template.Remove(block.Start, block.Length);
  68. } else {
  69. strategy.DeleteFile(fileName);
  70. }
  71. }
  72. }
  73.  
  74. /// <summary>
  75. /// SQL[不完善,需要的自己改造]
  76. /// 更换字段类型
  77. /// </summary>
  78. /// <param name="type"></param>
  79. /// <returns></returns>
  80. public string TransFromSqlType(string type)
  81. {
  82. if (string.IsNullOrEmpty(type))
  83. {
  84. return string.Empty;
  85. }
  86. if (string.Equals(type, "Boolean", StringComparison.OrdinalIgnoreCase))
  87. {
  88. return "bool";
  89. }
  90. else if (string.Equals(type, "Int32", StringComparison.OrdinalIgnoreCase))
  91. {
  92. return "int";
  93. }
  94. else if (string.Equals(type, "Int64", StringComparison.OrdinalIgnoreCase))
  95. {
  96. return "long";
  97. }
  98. else if (string.Equals(type, "String", StringComparison.OrdinalIgnoreCase))
  99. {
  100. return "string";
  101. }
  102. else if(string.Equals(type, "Byte", StringComparison.OrdinalIgnoreCase))
  103. {
  104. return "byte";
  105. }
  106. else if (string.Equals(type, "Decimal", StringComparison.OrdinalIgnoreCase))
  107. {
  108. return "decimal";
  109. }
  110. else if (string.Equals(type, "datetime", StringComparison.OrdinalIgnoreCase))
  111. {
  112. return "DateTime";
  113. }
  114. return "string";
  115. }
  116.  
  117. }
  118.  
  119. class ManagementStrategy
  120. {
  121. internal static ManagementStrategy Create(ITextTemplatingEngineHost host) {
  122. return (host is IServiceProvider) ? new VSManagementStrategy(host) : new ManagementStrategy(host);
  123. }
  124.  
  125. internal ManagementStrategy(ITextTemplatingEngineHost host) { }
  126.  
  127. internal virtual void CreateFile(String fileName, String content) {
  128. File.WriteAllText(fileName, content);
  129. }
  130.  
  131. internal virtual void DeleteFile(String fileName) {
  132. if (File.Exists(fileName))
  133. File.Delete(fileName);
  134. }
  135. }
  136.  
  137. class VSManagementStrategy : ManagementStrategy
  138. {
  139. private EnvDTE.ProjectItem templateProjectItem;
  140.  
  141. internal VSManagementStrategy(ITextTemplatingEngineHost host) : base(host) {
  142. IServiceProvider hostServiceProvider = (IServiceProvider)host;
  143. if (hostServiceProvider == null)
  144. throw new ArgumentNullException("Could not obtain hostServiceProvider");
  145.  
  146. EnvDTE.DTE dte = (EnvDTE.DTE)hostServiceProvider.GetService(typeof(EnvDTE.DTE));
  147. if (dte == null)
  148. throw new ArgumentNullException("Could not obtain DTE from host");
  149.  
  150. templateProjectItem = dte.Solution.FindProjectItem(host.TemplateFile);
  151. }
  152.  
  153. internal override void CreateFile(String fileName, String content) {
  154. base.CreateFile(fileName, content);
  155. ((EventHandler)delegate { templateProjectItem.ProjectItems.AddFromFile(fileName); }).BeginInvoke(null, null, null, null);
  156. }
  157.  
  158. internal override void DeleteFile(String fileName) {
  159. ((EventHandler)delegate { FindAndDeleteFile(fileName); }).BeginInvoke(null, null, null, null);
  160. }
  161.  
  162. private void FindAndDeleteFile(String fileName) {
  163. foreach(EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems) {
  164. if (projectItem.get_FileNames() == fileName) {
  165. projectItem.Delete();
  166. return;
  167. }
  168. }
  169. }
  170. }#>

接下来就是见证奇迹的时刻,选中 TextTemplate_Test.tt 文件 按 Ctrl+C即可(每次更新实体类时,需要先修改一下模板文件,随便修改什么地方,按个空格也可以),生成模板代码如下:

c# 使用T4模板生成实体类(sqlserver)的更多相关文章

  1. {T4模板}C# Net MVC+SqlServer=T4模板生成实体类并操作数据(DbHelper+DBManage)

    1.ConnectionString,数据库链接 Web.config <configuration> <connectionStrings> <!-- 数据库 SQL ...

  2. c# T4模板生成实体类(sqlserver)

    1.用vs新建tt文件. 2.tt文件保存就自动运行 3.tt文件代码如下,设置生成cs文件的命名空间和生成地址 <#@ template language="C#" hos ...

  3. C# T4 模板 数据库实体类生成模板(带注释,娱乐用)

     说明:..,有些工具生成实体类没注释,不能和SqlServer的MS_Description属性一起使用,然后照着网上的资源,随便写了个生成模板,自娱自乐向,其实卵用都没有参考教程    1.htt ...

  4. 使用T4模板生成POCO类

    为什么叫T4?因为简写为4个T. T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎.在 Visua ...

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

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

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

    为了减少重复劳动,可以通过T4读取数据库表结构,生成实体类,用下面的实例测试了一下 1.首先创建一个项目,并添加文本模板: 2.添加 文本模板: 3.向T4文本模板文件添加代码: <#@ tem ...

  7. 使用T4模板生成MySql数据库实体类

    注:本文系作者原创,但可随意转载. 现在呆的公司使用的数据库几乎都是MySQL.编程方式DatabaseFirst.即先写数据库设计,表设计按照规范好的文档写进EXCEL里,然后用公司的宏,生成建表脚 ...

  8. 使用T4为数据库自动生成实体类

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

  9. 懒人小工具:T4生成实体类Model,Insert,Select,Delete以及导出Excel的方法

    由于最近公司在用webform开发ERP,用到大量重复机械的代码,之前写了篇文章,懒人小工具:自动生成Model,Insert,Select,Delete以及导出Excel的方法,但是有人觉得这种方法 ...

随机推荐

  1. Webpack 一,打包JS

    创建入口文件 app.js // es6 module 规范 import sum_d from './sum.js' import {sum_e} from './sum.js' // commco ...

  2. RUST actix-web连接有密码的Redis数据库

    RUST actix-web连接有密码的Redis数据库 actix-web的example里面,使用了自己的actix-redis,但是我尝试了一下,并不好用 替换成另一连接池,deadpool-r ...

  3. CCF_ 201403-4_无线网络

    分散点的bfs,先建立一个互相是否可达的二维数组,vis[i][j]代表到第i个点,走了j步的状态,注意判断新增路由器数量是否超过K. #include<cstdio> #include& ...

  4. Redis 3.2.3: 集群3哨兵模式

    简介 Redis是一个使用ANSI C编写的开源.支持网络.基于内存.可选持久性的键值对存储数据库.从2015年6月开始,Redis的开发由Redis Labs赞助,而2013年5月至2015年6月期 ...

  5. Python应用——多变量的灵活处理

    本文始发于个人公众号:TechFlow,原创不易,求个关注 我们都知道Python是一个非常灵活的语言,以至于如果它不是你的第一门语言,你会发现它总能给你各种各样的惊喜,让你忍不住惊叹:woc,还有这 ...

  6. JVM解毒——JVM与Java体系结构

    你是否也遇到过这些问题? 运行线上系统突然卡死,系统无法访问,甚至直接OOM 想解决线上JVM GC问题,但却无从下手 新项目上线,对各种JVM参数设置一脸懵逼,直接默认,然后就JJ了 每次面试都要重 ...

  7. 基于原生的 html css js php ajax做的一个 web登录和注册系统

    完整代码下载: 百度网盘地址 https://pan.baidu.com/s/1D1gqHSyjgfoOtYCZm7ofJg 提取码 :nf0b 永久有效 注意: 1 如果要正常运行此示例, 本地需要 ...

  8. Linux系统下常见的数据盘分区丢失的问题以及对应的处理方法

    在修复数据前,您必须先对分区丢失的数据盘创建快照,在快照创建完成后再尝试修复.如果在修复过程中出现问题,您可以通过快照回滚将数据盘还原到修复之前的状态. 前提条件 在修复数据前,您必须先对分区丢失的数 ...

  9. ts的特殊数据类型

    四. Ts数据类型 tuple(元组类型):可以给数组指定位置存指定类型数据 例:let arr:[number, string] = [123, ‘123’]; enum(枚举):将数字转化为标识符 ...

  10. 第三篇 SpringBoot整合log4j2详解

    源代码:https://pan.baidu.com/s/1d1Lwv1gIvVNltIKVWeEseA 提取码:wff0 SpringBoot整合Log4j2步骤: 1.删除spring-boot-s ...