T4模板之菜菜鸟篇
一、废话
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模板之菜菜鸟篇的更多相关文章
- T4模板之基础篇
		
一.回顾 上一篇文章 ——T4模板之菜菜鸟篇,我们囫囵吞枣的创建了与“T4模板”有关的文件.在创建各个文件的这一个过程中,我们对于T4模板有了那么丁点的认识.现在就带着之前的那些问题,正式的迈入对“T ...
 - T4模板试水篇1_入门
		
T4模板作为VS自带的一套代码生成器,功能有多强大我也不知道,最近查找了一些资料学习一下,做个笔记 更详细的资料参见: MSDN: http://msdn.microsoft.com/zh-cn/li ...
 - 前端基于react,后端基于.net core2.0的开发之路(番外篇) 后端使用T4模板,生成某些类
		
1.介绍 因为开发过程中,有部分类是你加一个模型,就需要去改动的,每次加非常的烦,或者有些类,你只用到了他基类的方法,但是你还必须建一个文件才能调用他基类的方法,也很烦. 这个时候,T4就非常有用了. ...
 - 解决T4模板的程序集引用的五种方案
		
在众多.NET应用下的代码生成方案中,比如CodeDOM,BuildProvider, 我觉得T4是最好的一种.关于T4的基本概念和模板结果,可以参考我的文章<基于T4的代码生成方式>.如 ...
 - CSharpGL(12)用T4模板生成CSSL及其renderer代码
		
CSharpGL(12)用T4模板生成CSSL及其renderer代码 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立 ...
 - JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面
		
前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...
 - MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码
		
前言 经过前面EF的<第一篇>与<第二篇>,我们的数据层功能已经较为完善了,但有不少代码相似度较高,比如负责实体映射的 EntityConfiguration,负责仓储操作的I ...
 - 23、ASP.NET MVC入门到精通——业务层和数据层父类及接口-T4模板
		
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在上一篇中,我们已经把项目的基本框架搭起来了,这一篇我们就来实现业务层和数据层的父接口及父类. 1.我们先来定义一个业务层父接口IBaseB ...
 - T4 模板 : 一种提升ASP.NET MVC开发速度方法
		
最近由于需要在框架中提供一些自定义模板的功能,找到了一篇博客,可惜似乎是翻译工具直接翻的,读不通顺,就试着自己翻译下,我不会完全翻译原文的句子,可能会对原文进行小范围的我认为更合适的句子并添加些注释, ...
 
随机推荐
- Hibernate 、多表关联映射 - 多对多关系映射(many-to-many)
			
hibernate.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...
 - Subsequence(暴力+二分)
			
Subsequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10875 Accepted: 4493 Desc ...
 - 重写系统中的UINavigationController返回按钮的事件
			
1.扩展UIviewController UIViewController+BackButtonHandler.h #import <UIKit/UIKit.h> @protocol Ba ...
 - myeclipse配置weblogicserver
			
使用myeclipse设置weblogic时在window下打开preferences,选择myeclipse->Servers,选择weblogic,选择对应的版本号,这里我电脑上安装的是we ...
 - OCP准备记录
			
0628: 051 OK053 1-192! 加油了,每天至少100道吧明天复习一下626,627,628这几天的成果先看一遍对的,再看一遍错的!!最少要把051复习一遍 0629: 今天忙了太久 只 ...
 - 网上B2C书城,1.0javaWEB版!!好几天没更新了,都忙着做那个网站了~
			
惯例帮师傅打个广告www.java1234.com,从基础学习java WEB! 从最初的构思,到一点点功能的实现,真是不容易啊,由于自己没有项目经验,完全依靠自己的感觉,以及自己琢磨出来的思路来写, ...
 - ORA-600[kcratr_scan_lastbwr]逻辑坏块解决
			
数据库版本: 11.2.0.3 问题现象: 今天在启动一台测试数据库的时候,发现db不能open,报错如下: ERROR at line 1: ORA-00600: internal error co ...
 - echo向文件中写入
			
echo命令向一个文件写入内容的方法详解,感兴趣的朋友可以参考下. 覆盖型写法 (文件里原来的内容被覆盖)echo "aaa" > a.txtecho aaa > a. ...
 - PHP获取中文汉字首字母方法
			
function getFirstLetter($str){ $fchar = ord($str{0}); if($fchar >= ord("A") and $fchar ...
 - QF——OC内存管理详解
			
堆的内存管理: 我们所说的内存管理,其实就是堆的内存管理.因为栈的内存会自动回收,堆的内存需要我们手动回收. 栈中一般存储的是基本数据类型变量和指向对象的指针(对象的引用),而真实的对象存储在堆中.因 ...