惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Jina AI
Jina AI
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
J
Java Code Geeks
博客园 - 【当耐特】
小众软件
小众软件
博客园 - Franky
S
SegmentFault 最新的问题
WordPress大学
WordPress大学
雷峰网
雷峰网
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
Last Week in AI
Last Week in AI
博客园_首页
月光博客
月光博客
IT之家
IT之家
阮一峰的网络日志
阮一峰的网络日志
Webroot Blog
Webroot Blog
Stack Overflow Blog
Stack Overflow Blog
腾讯CDC
云风的 BLOG
云风的 BLOG
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
Recent Commits to openclaw:main
Recent Commits to openclaw:main
D
Docker
The Last Watchdog
The Last Watchdog
有赞技术团队
有赞技术团队
Hacker News - Newest:
Hacker News - Newest: "LLM"
D
DataBreaches.Net
S
Security @ Cisco Blogs
Blog — PlanetScale
Blog — PlanetScale
GbyAI
GbyAI
TaoSecurity Blog
TaoSecurity Blog
S
Security Affairs
Y
Y Combinator Blog
O
OpenAI News
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Forbes - Security
Forbes - Security
P
Palo Alto Networks Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
K
Kaspersky official blog
Cloudbric
Cloudbric

博客园 - Kain

Microsoft.Practices.Unity 的一个线程安全Bug浅析 NET Reflector 7发布,其 不再免费 (抽象)工厂的另一种实现方式 .net 4.0 中对多线程新特性(四)--任务和任务工厂 .net 4.0 中对多线程新特性(三) .net 4.0 中对多线程新特性(二) .net 4.0 中对多线程新特性(一) Flex&.Net开篇 SqlSever N层表数据查询效率 [读书笔记]Start-up fatigue(启动杂役) 马上又要过中秋和国庆了! 一个小问题 C#2.0 新的关键字 yield 我们的游戏! 不知道有没有同在学习aspnetforums的 郁闷! 关于面试 关于DataGride的Key事件 开心就好!
自定义EF4 Model 代码生成
Kain · 2010-08-13 · via 博客园 - Kain

     在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交互所以可以完全移除了。这个过程比较简单,根据编译错误可以很容易调整过了,这里限于篇幅限制就不详细介绍了。最后的调用代码可能是这样:

整个过程其实比较简单的,就不放完整的代码了,动动手有益健康。附件