相信很多人都用T4模版生成代码,用T4模版生成标准代码真的很方便。我们经常根据表生成相关的代码, 但是估计很多人都遇见过同一个问题, 特别是我们在生成model的时候,代码中model中的Summary一直无法生成。这个问题也困扰了我很久,也找了很多方案,一直没有更好的方法。问题如下:

解决方案

为了生成summary需要额外的增加一个类,并在T4模版中引用这个类即可。这个类的作用是根据表名和列名提取数据表中列的description。

1. 首先查询数据库中所有表和列的基本信息

为了方便起见,我在数据库中创建了一个视图,视图结构如下:

sql 脚本如下:

SELECT   TOP (100) PERCENT COALESCE (T.name, OBJECT_NAME(C.object_id)) AS TableName, TB.TableDESC,
                C.name AS ColumnName, TYPE_NAME(C.user_type_id) AS DataType, D.definition AS DefaultSetting,
                C.is_nullable AS IsNullable, C.max_length AS MaxLength, COLUMNPROPERTY(C.object_id, C.name, 'PRECISION')
                AS Precision, P.value AS ColumnDESC
FROM      sys.columns AS C LEFT OUTER JOIN
                sys.table_types AS T ON T.type_table_object_id = C.object_id LEFT OUTER JOIN
                sys.default_constraints AS D ON C.object_id = D.parent_object_id AND
                D.parent_column_id = C.column_id LEFT OUTER JOIN
                sys.extended_properties AS P ON (P.major_id = C.object_id OR
                P.major_id = T.user_type_id) AND P.minor_id = C.column_id AND P.name = 'MS_Description' LEFT OUTER JOIN
                    (SELECT   INFORMATION_SCHEMA.TABLES.TABLE_NAME AS TableName, P.value AS TableDESC
                     FROM      INFORMATION_SCHEMA.TABLES LEFT OUTER JOIN
                                     sys.extended_properties AS P ON
                                     OBJECT_ID(INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA + '.' + INFORMATION_SCHEMA.TABLES.TABLE_NAME)
                                      = P.major_id AND P.minor_id = 0
                     WHERE   (INFORMATION_SCHEMA.TABLES.TABLE_TYPE = 'BASE TABLE')) AS TB ON COALESCE (T.name,
                OBJECT_NAME(C.object_id)) = TB.TableName
WHERE   (COALESCE (SCHEMA_NAME(T.schema_id), OBJECT_SCHEMA_NAME(C.object_id)) = 'dbo')
ORDER BY TableName

2.在代码中计算description

3.T4模版调用

前面已经创建了一个类,这个类很简单,就是根据表名和列名获取对应的description。现在只要在T4模版中引用这个类即可。代码中要注意两点。直接上代码:

1. 必须要在T4模板的头部引用上面类的dll,否则无法引用命名空间。我用的是相对路径。其中$(SolutionDir)表示的solution所在的文件夹。

2.引用命名空间,下图中红线部分2行

在T4模板中直接调用方法即可,这样就可以根据表个列表获取到相应的description作为类的summary了。

这里提到一点,T4模版的代码中这个我用了一个replace,是因为我在写列描述的时候有换行,所以我把数据库中的换行转换成了summary中的换行,效果如下:

生成的代码的demo

跟大家提供几个生成代码的截图吧,怎么样所有的summary都已经根据数据库生成出来了吧

总结

个人认为这个方法是最简单的方法也是最有效的了,应该没有比这个在简单了。欢迎大家拍砖

T4模板根据数据库表和列的Description生成代码的summary的终极解决方案的更多相关文章

  1. EntityFramework Core 2.x (ef core) 在迁移中自动生成数据库表和列说明

    在项目开发中有没有用过拼音首字母做列名或者接手这样的项目? 看见xmspsqb(项目审批申请表)这种表名时是否有一种无法抑制的想肛了取名的老兄的冲动? 更坑爹的是这种数据库没有文档(或者文档老旧不堪早 ...

  2. Mysql 数据库 表中列的操作

    [1]Mysql数据库中表的列操作 Mysql中关于表中列的操作集语句: -- [1]增加一列 ) DEFAULT NULL COMMENT '目的码区号'; -- [2]增加一列,在dnis_are ...

  3. SQL 数据库表标识列初始化 DBCC

    把ArimaIndexForecastModel这张表的标识列重置为0,前提是这张表执行过删除操作 示例:  dbcc checkident('ArimaIndexForecastModel',res ...

  4. SQL Server 查询数据库表的列数

    select count(*) from sysobjects a join syscolumns b on a.id=b.id where a.name='表名' go

  5. 阶段3 1.Mybatis_12.Mybatis注解开发_5 mybatis注解建立实体类属性和数据库表中列的对应关系

    创建新项目,一对多 复制刚才关闭的项目的文件 复制到们的新项目里面 复制包的依赖 删减相关代码.只保留这三个查询的方法 模糊查询改成传统的占位符的方式 之前是可以自定义实体类的属性字段,和数据库的字典 ...

  6. MySQL必知必会-官方数据库表及SQL脚本导入生成

    最近在复习SQL语句,看的是MySQL必知必会这本书,但是发现附录中只有表设计,没有表的具体数据.所以在学习相应的语句中体验不是很好,去网上查了数据库的内容,自己慢慢导入到了数据库中.把表放出来作为参 ...

  7. 在运行程序时报错:"如果在 Code First 模式下使用,则使用 T4 模板为 Database First 和 Model First 开发生成的代码可能无法 正常运行。若要继续使用 Database First 或 Model First,请确保在执行应用程序的 config 文件中指 定 Entity Framework 连接字符串。若要将这些从 Database First 或 Mod

    解决方案: 将context类下的方法“OnModelCreating”修改为: protected override void OnModelCreating(DbModelBuilder mode ...

  8. mybatis-generator指定列进行自动生成代码

    目前mybatis-generator已经升级到1.3.3,功能比较强大,但是目前从table中如果字段较多可以选择忽略生产的字段(通过ignoreColumn属性实现,http://generato ...

  9. T4模板编辑器

    一 二.工具  (T4模板编辑器) 使用效果 1.tangibleT4EditorPlusModellingToolsVS2013.msi 2.devart T4 Editor for Visual ...

随机推荐

  1. CVPR2013总结

    前不久CVPR的结果出来了,首先恭喜我一个已经毕业工作的师弟中了一篇文章.完整的文章列表已经在CVPR的主页上公布了(链接),今天把其中一些感兴趣的整理一下,虽然论文下载的链接大部分还都没出来,不过可 ...

  2. 背水一战 Windows 10 (44) - 控件(日期类): CalendarView, DatePicker, TimePicker

    [源码下载] 背水一战 Windows 10 (44) - 控件(日期类): CalendarView, DatePicker, TimePicker 作者:webabcd 介绍背水一战 Window ...

  3. 【转】C#模拟http 发送post或get请求

    原文地址:http://www.cnblogs.com/xssxss/archive/2012/07/03/2574554.html 模拟POST Json public static string ...

  4. 【CJOJ2616】 【HZOI 2016】偏序 I(cdq分治,树状数组)

    传送门 CJOJ Solution 考虑这是一个四维偏序对吧. 直接cdq套在一起,然后这题有两种实现方法(树状数组的更快!) 代码实现1(cdq+cdq+cdq) /* mail: mleautom ...

  5. python 数据类型二 (列表和元组)

    一.列表 1.1 列表的介绍 列表是python的基本数据类型之一,其他编程语言也有类似的数据类型,比如JS中的数组,java中的数组等等,它是以[]括起来,每个元素用逗号隔开,而且可以存放各种数据类 ...

  6. js中cookie,localStorage(sessionStorage)的存取

    一.cookie (原生的不好用,自己简单封装) 1. 存cookie的方法: function setCookie(c_name,value,expiredays) { var exdate=new ...

  7. fastjson 反序列化漏洞笔记,比较乱

    现在思路还是有点乱,希望后面能重新写 先上pon.xml 包 <?xml version="1.0" encoding="UTF-8"?> < ...

  8. [工具]Cobalt Strike 3.13 TeamServer for Windows

    Cobalt Strike 3.13 TeamServer for Windows 0x001 环境 CS 3.12 或 3.13 Kali或Win最好安装jdk1.8.5或之后版本 设置环境变量,如 ...

  9. Docker三剑客之Docker Machine

    一.什么是Docker Machine Docker Machine 是Docker官方编排项目之一,使用go语言编写的,使用不同引擎在多种平台上快速的安装Docker环境,开源地址:https:// ...

  10. vue教程1-05 事件 简写、事件对象、冒泡、默认行为、键盘事件

    vue教程1-05 事件 简写.事件对象.冒泡.默认行为.键盘事件 v-on:click/mouseover...... 简写的: @click="" 推荐 事件对象: @clic ...