Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 478|回复: 0

T4模板根据数据库表和列的Description生成代码的summary的终极解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-7-9 21:04:24 | 显示全部楼层 |阅读模式

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

    image

    解决方案

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

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

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

    image

     

    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

    Untitled-1

     

    3.T4模版调用

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

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

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

    image

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

     

    image

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

    image

     

    生成的代码的demo

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

    image

     

    总结

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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 09:27 , Processed in 0.181786 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表