一、废话

T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎。在 Visual Studio 中,“T4 文本模板”是由一些文本块和控制逻辑组成的混合模板,它可以生成文本文件。 在 Visual C# 或 Visual Basic 中,控制逻辑编写为程序代码的片段。生成的文件可以是任何类型的文本,例如网页、资源文件或任何语言的程序源代码。现在的VS中只要与代码生成相关的场景基本上都能找T4的身影,比如MVC的视图模板,Entity Framwork的DataContext模板等等。

二、说明

1、文本是基于Visual Studio 2013 + vs插件(Devart T4 Editor) 讲述的,为什么不用Visual Studio 2015,目前Devart T4 Editor不支持vs2015,有点蛋疼。哪个高手懂得VS插件的制作,帮忙升级下 Devart T4 Editor 呗。

2、这应该真心是一篇For菜菜鸟的文章,但凡有经验的就略过吧!

三、视觉优先

1、新建一个控制台应用程序(Zeje.T4)

2、在项目中“添加”->”新建项”,弹出“添加新项”对话框,在右上角的搜索框输入“模板”,分别针对这四种模板创建新项。

3、文件创建后,解决方案资源管理器的列表展示如下。

4、各种疑问

4.1、EF 5.x DbContext生成器是啥?

4.2、EF 6.x DbContext生成器是啥?

4.3、文本模板是啥?

4.4、运行时文本模板是啥?

四、解惑

1、返璞归真

  • 不管是什么,都是文件,要么是“文件”,要么是“文件组”
  • 都有后缀为.tt的文件
  • 后缀为.tt的文件,我们统称其为“T4模板文件”

2、各个击破

2.1 、EF 5.x DbContext生成器

点击添加后,生成的是两个后缀为.tt的文件

刚才命名是“EF5”,那么它就是帮我们产生两个叫“XX.Context.tt”和“XX.tt”的文件。

打开EF5.Context.tt和EF5.tt文件,都是TMD的一堆代码,真心看不懂有木有?那就PASS吧!

2.2、EF 6.x DbContext生成器

TMD呀!跟2.1说的完全一样,还是TMD的一堆代码。不过细心的会发现,文件里的内容会有所不同。是PASS吗?不,展开看看

文件EF6.Context.cs和EF6.cs里面基本上没有内容,回去看看EF5.Context.cs和EF5.cs文件,基本上一样也是没有内容,PASS吧!

2.3、文本模板

打开TextTemplate_.tt,眼前一亮的有木有,这是多大的差距呀!

这TextTemplate_.tt文件中的内容就是这般简单,TextTemplate_.txt文件里什么内容都木有。

为什么有的.tt文件下面展开的是XXX.cs文件,而又得却是XXX.txt文件呢?回头仔细研究下,原来是这段代码(如下图)在作怪

2.4、运行时文本文件

分别打开RuntimeTextTemplate_.tt和RuntimeTextTemplate_.cs的文件,是否又如上面的一样.tt文件一堆代码而展开后的文件基本没内容?好吧!原以为自己找到规律了,却发现自己太天真了,.tt文件内容很少,.cs文件的内容又是一堆!

五、雪上加霜

为什么雪上加霜呢?因为下面的也跟T4模板扯上点关系!

0、新建项目“Zeje.EF_”(项目类型为类库,.net framework版本为4.5)

1、在项目中“添加”->”新建项”,弹出“添加新项”对话框,在右上角的搜索框输入“模型”,创建ADO.NET实体数据模型“Zeje.Hr”

2、点击添加,发现了一个选择题,到底选哪个?

  • 来自数据库的EF设计器
  • 空EF设计器模型
  • 空Code First模型
  • 来自数据库的Code First

好吧,就让暴风雨来得更猛烈些吧!咱们四个都创建,分别命名,对比下(具体新建过程就不列出来占用篇幅了)!

  • 来自数据库的EF设计器(命名: DBFirst,数据库基于自己本地的[Zeje.Hr]数据库)

  • 空EF设计器模型(命名: DBFirst_)

  • 空Code First模型(命名: CodeFirst_,)

  • 来自数据库的Code First(命名: CodeFirst,数据库基于自己本地的[Zeje.Hr]数据库【把相关放在CodeFirst文件夹中】)

好吧!不敢跟我耍狠了,只有第一种才跟T4模板扯上关系。再把图片引用下,相关T4模板文件已经用红色框圈住了,解说下吧!

  • DBFirst.edmx【本质上就是一个XML文件,记录的是数据库映射出来的实体,这实体包括表、视图、存储过程、约束等】
  • DBFirst.Context.tt 【T4模板,展开后下面有一个DBFirst.Designer.cs文件】
  • DBFirst.Designer.cs【还真不知道现在起什么作用】
  • DBFirst.edmx.diagram【本质上就是一个XML文件,记录的是edmx设计视图下实体的坐标】
  • DBFirst.tt【T4模板,展开后下面还有多个.cs文件,TMD这又跟上面的只有一个.cs或者一个.txt文件不同,至于怎么整的后面一起研究】

对于这些个文件,它们是一个文件组,它们的布局取决于【Zeje.EF_.csproj】文件,假如用记事本打开,它的本质也一个XML文件,通过一定的规则,把上述文件组织在一起而已。在日常的操作中,我们可能一不小心随便拖动下这些个文件中的某一个,它的组合就乱了,那个时候就只能通过手动调整.csproj文件,重新按照既定规则组合起来。

T4模板之菜菜鸟篇的更多相关文章

  1. T4模板之基础篇

    一.回顾 上一篇文章 ——T4模板之菜菜鸟篇,我们囫囵吞枣的创建了与“T4模板”有关的文件.在创建各个文件的这一个过程中,我们对于T4模板有了那么丁点的认识.现在就带着之前的那些问题,正式的迈入对“T ...

  2. T4模板试水篇1_入门

    T4模板作为VS自带的一套代码生成器,功能有多强大我也不知道,最近查找了一些资料学习一下,做个笔记 更详细的资料参见: MSDN: http://msdn.microsoft.com/zh-cn/li ...

  3. 前端基于react,后端基于.net core2.0的开发之路(番外篇) 后端使用T4模板,生成某些类

    1.介绍 因为开发过程中,有部分类是你加一个模型,就需要去改动的,每次加非常的烦,或者有些类,你只用到了他基类的方法,但是你还必须建一个文件才能调用他基类的方法,也很烦. 这个时候,T4就非常有用了. ...

  4. 解决T4模板的程序集引用的五种方案

    在众多.NET应用下的代码生成方案中,比如CodeDOM,BuildProvider, 我觉得T4是最好的一种.关于T4的基本概念和模板结果,可以参考我的文章<基于T4的代码生成方式>.如 ...

  5. CSharpGL(12)用T4模板生成CSSL及其renderer代码

    CSharpGL(12)用T4模板生成CSSL及其renderer代码 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立 ...

  6. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面

    前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...

  7. MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码

    前言 经过前面EF的<第一篇>与<第二篇>,我们的数据层功能已经较为完善了,但有不少代码相似度较高,比如负责实体映射的 EntityConfiguration,负责仓储操作的I ...

  8. 23、ASP.NET MVC入门到精通——业务层和数据层父类及接口-T4模板

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在上一篇中,我们已经把项目的基本框架搭起来了,这一篇我们就来实现业务层和数据层的父接口及父类. 1.我们先来定义一个业务层父接口IBaseB ...

  9. T4 模板 : 一种提升ASP.NET MVC开发速度方法

    最近由于需要在框架中提供一些自定义模板的功能,找到了一篇博客,可惜似乎是翻译工具直接翻的,读不通顺,就试着自己翻译下,我不会完全翻译原文的句子,可能会对原文进行小范围的我认为更合适的句子并添加些注释, ...

随机推荐

  1. Controller中获取输入参数注解使用总结

    1.处理request的uri部分的参数(即restful访问方式):@PathVariable. 当使用restful访问方式时, 即 someUrl/{paramId}, 这时的参数可通过 @Pa ...

  2. Expect:100-Continue & HTTP 417 Expectation[转]

    Expect:100-Continue & HTTP 417 Expectation 背景:今天调试火车票查询的代码,发现一个奇怪的事情,如果使用公司本地的代理,那么一切正常,如果使用的是公司 ...

  3. cdh 上安装spark on yarn

    在cdh 上安装spark on yarn 还是比较简单的,不需要独立安装什么模块或者组件. 安装服务 选择on yarn 模式:上面 Spark 在spark 服务中添加 在yarn 服务中添加 g ...

  4. Linux学习awk命令

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  5. Tomcat 设置为服务使用脚本 service

    进入到Tomcat的bin目录下,如果使用的是Windows系统则使用service.bat进行操作;Linux系统则使用service.sh进行. service.bat install/remov ...

  6. Android 自带 camera 详解

    在本文中 需要考虑的问题 概述 Manifest声明 使用内置的摄像头应用程序 捕获图像的intent 捕获视频的intent 接收摄像头intent的结果 创建摄像头应用程序 检测摄像头硬件 访问摄 ...

  7. Chrome disable adobe flash player

    New tab and input : chrome://plugins/ so easy~!

  8. php 常用经验

    1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的”函数”(译注:PHP手 ...

  9. codeforces 659F . Polycarp and Hay 搜索

    题目链接 遍历每个点, 如果这个点的值能被k整除并且k/a[i][j]后小于等于n*m, 那么就对这个点进行搜索. 将这个点加入队列, 将周围的所有大于等于这个点的值的点也加入队列. 不断重复, 直到 ...

  10. Selenium自动化测试(java语言)

    Selenium介绍 Selenium 1.0 包含 core. IDE. RC. grid 四部分,  selenium 2.0 则是在两位大牛偶遇相互沟通决定把面向对象结构化( OOPP) 和便于 ...