自定义EF4 Model 代码生成
在VS2010中EF4提供了三种代码生成方式:EntityObject,POCO,Self-Tacking。默认VS2010只带有EntityObject模板,可以通过浏览Online Templates中的项目将剩余的两种添加到本地模板文件中来。三种代码模板都是通过T4模板引擎来实现的,因此通过分析一下模板文件我们也能够实现自己的代码生成器。
在项目中添加一个模板文件,打开.tt的文件,在文件的头部会有一行代码<#@ include file="EF.Utility.CS.ttinclude"#>,EF.Utility.CS.ttinclude是一个非常有用的文件,主要是用来分析edmx文件和生成模型代码的,要实现自己的代码生成器首先得找到这个文件,通过搜索这个文件放置在:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\Templates\Includes目录。用VS打开这个文件发现它其实就是个代码文件。新建一个Project将文件中的CS代码copy到一个新的CodeGenerationTools类中,引用必要的Assembly和Namespace就可以了。在本文附件中找到两个Dll:Microsoft.VisualStudio.TextTemplating.10.0.dll和Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll 这两个dll是T4模板的引擎,具体的使用在网上有很多介绍这里就不再赘述了。在项目中添加EntityObject,POCO,Self-Tacking三个模板文件,将默认文件名改成对应的模板名称,这样便于区分。在添加模板文件的时候IDE可能会出现很多Error信息,直接跳过可以了。在出错信息中会有个错误信息说需要用实际的edmx文件路径替换掉 $edmxInputFile$ 。这个地方就是后面我们需要修改的地方。选择tt模板文件在文件属性中将Customer Tool里面的内容清空,这样IDE就不会自动生成不必要的cs文件也不会提示错误了。在项目文件中新增一个新类EntityFrameworkTemplateHost实现ITextTemplatingEngineHost接口。这类将来主要负责传递一些配置信息。具体的代码可以在附件中找到这里面就不贴了,网上关于T4模板介绍的中都有其使用介绍。
完成这些就需要对模板文件和CodeGenerationTools中的内容做一些调整。首先是修改每个模板文件在在每个模板的头中添加必要的名称空间引用,如果后面的执行中出现类型找不到就是在这里没有添加必要的名称空间了。在模板文件中找到带有$edmxInputFile$文本的哪行,将其替换为:
EntityFrameworkTemplateHost host = (EntityFrameworkTemplateHost)(Host);
string inputFile = host.EDMXFile;//EDMXFile是EntityFrameworkTemplateHost定义的一个属性由外部传入。
打开CodeGenerationTools文件,去掉EnvDTE引用,因为这个是在IDE环境中用到的,这里我们不需要和IDE交互所以可以完全移除了。这个过程比较简单,根据编译错误可以很容易调整过了,这里限于篇幅限制就不详细介绍了。最后的调用代码可能是这样:
整个过程其实比较简单的,就不放完整的代码了,动动手有益健康。附件