新年首作-ELinq+T4模版引擎制作多文件实体代码生成器
2013-02-15 17:48 by 风云, 303 阅读, 6 评论, 收藏, 编辑
关于代码生成器的文章网上已经多的不能太多了,在6年前我写过两篇文章介绍代码生成器的,一篇主要代码生成器的7种模型架构设计思想:也谈代码生成器,另外一篇再谈代码生成器介绍了基于其中一种模型架构的实践文章,现在回顾一下6年前的文章拿到现在其设计思想也从不过时,呵呵自大了。好了废话不多说,今天给大家分享一下利用ELinq内置的数据库元数据模型和T4 模版引擎制作多文件实体代码生成器。(ELinq:是一个轻量简单易用的开源Linq ORM数据访问组件,支持Nullable类型和枚举类型,支持根据实体类自动建库建表建关系,支持根据数据库通过T4模版自动生成实体代码,对Linq 的谓词提供了完美的支持,旨在让绝大部份的主流数据库都使用 Linq 来进行程序开发,让开发人员访问数据库从SQL中解放出来,易学易用上手快,配置简单,并且提供了源代码下载,方便定制。支持多数据库,目前支持 Access、SQLServer、SqlCE、 SQLite、MySQL、ORACLE,未来还会支持更多的数据库)
本文使用以下工具:
- VS2010 SP1
- T4 模版引擎
- ELinq 数据库元数据模型(借助ELinq强大的ORM框架,支持多种数据库)
- SqlServer 数据库
操作步骤
- 创建控制台应用程序 Demo
- 通过Nuget添加ELinq 的引用:在Nuget控制台中输入:install-package ELinq, Nuget会自动的将你引用的库的这个库的依赖文件添加到你的项目引用中.
- 配置SqlServer数据库连接信息。添加App.Config 文件,并添加如下的配置信
<add name="Northwind" connectionString="Data Source=.;Initial Catalog=northwind;Persist Security Info=True;User ID=sa;Password=" providerName="System.Data.SqlClient" />
-
编译项目,保证ELinq已经输出到Bin目录下,为T4 模版准备
- 添加T4 文件,MultipleOutputHelper.ttinclude,该文件的作用是:生成多文件,获取当前活动项目的信息(配置文件路径,项目路径,数据路径,AppConfig等)
View Code
- 添加T4文件:NorthwindContext.tt
View Code
- 保存一下NorthwindContext.tt 文件,系统会自动创建实体、实体间的关系(一对多,多对一)和DbContext, 见下图
8. 运行代码查看
补充
1. ELinq 数据库Schema元数据结构图(只要配置好了DbConfiguration对象,只需要调用其Schema属性就会自动得到如下Schema数据
2. ELinq 还提供了表名到类名、列名到属性等转换约定,针对特殊情况可以自行定制
using System; using System.Collections.Generic; using System.Linq; using System.Text; using NLite.Data.Schema; namespace NLite.Data.CodeGeneration { /// <summary> /// 命名约定 /// </summary> public static class NamingConversion { /// <summary> /// 缺省命名约定 /// </summary> public static readonly INamingConversion Default = new DefaultNamingConversion(); } /// <summary> /// 命名约定 /// </summary> public interface INamingConversion { /// <summary> /// 表名转集合名 /// </summary> /// <param name="tableName"></param> /// <returns></returns> string QueryableName(string tableName); /// <summary> /// 表名转类名 /// </summary> /// <param name="tableName"></param> /// <returns></returns> string ClassName(string tableName); /// <summary> /// 列名转字段名 /// </summary> /// <param name="columnName"></param> /// <returns></returns> string FieldName(string columnName); /// <summary> /// 列名属性名转 /// </summary> /// <param name="columnName"></param> /// <returns></returns> string PropertyName(string columnName); /// <summary> /// 得到类的数据类型 /// </summary> /// <param name="col"></param> /// <returns></returns> string DataType(IColumnSchema col); /// <summary> /// 得到外键对应的导航属性名称 /// </summary> /// <param name="fk"></param> /// <returns></returns> string ManyToOneName(IForeignKeySchema fk); } }
3. 默认情况下自定义DbContext名称和T4模版文件的名称一致
4. 如何修该代码生成的命名空间以及数据库配置
总结
最后附上Demo代码,大家可以修改一下配置文件,即可支持其它数据库的代码生成,也可以修改T4 模版DIY 自己的代码生成器!随后会发布基于Nuget安装方式的T4 模版代码生成器包,供大家方便使用、
技术支持:
- 官方网站
- Nuge 下载页面
- ORM组件 ELinq系列
- ORM组件 ELinq 更新日志
- ORM组件 ELinq 使用答疑
- 在我的博客留言,我会尽可能地抽时间来答复大家的问题。
- 加入 ELinq用户的 QQ群(271342583)。
新年伊始,祝大家春节愉快,万事如意,谢谢大家的阅读,麻烦大伙点一下推荐,再次谢谢大家。 ^_^