Fork me on GitHub
ELinq+T4模版引擎制作多文件实体代码生成器

新年首作-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,未来还会支持更多的数据库

  本文使用以下工具:

  1. VS2010 SP1
  2. T4 模版引擎
  3. ELinq 数据库元数据模型(借助ELinq强大的ORM框架,支持多种数据库)
  4. SqlServer 数据库

    操作步骤

  1.   创建控制台应用程序 Demo
  2.   通过Nuget添加ELinq 的引用:在Nuget控制台中输入:install-package ELinq, Nuget会自动的将你引用的库的这个库的依赖文件添加到你的项目引用中.
  3.   配置SqlServer数据库连接信息。添加App.Config 文件,并添加如下的配置信
    <add name="Northwind" connectionString="Data Source=.;Initial Catalog=northwind;Persist Security Info=True;User ID=sa;Password="
    providerName="System.Data.SqlClient" />

     

  4. 编译项目,保证ELinq已经输出到Bin目录下,为T4 模版准备

  5. 添加T4 文件,MultipleOutputHelper.ttinclude,该文件的作用是:生成多文件,获取当前活动项目的信息(配置文件路径,项目路径,数据路径,AppConfig等)
    View Code
  6. 添加T4文件:NorthwindContext.tt
    View Code
  7. 保存一下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 模版代码生成器包,供大家方便使用、

技术支持:

  1. 官方网站
  2. Nuge 下载页面
  3. ORM组件 ELinq系列
  4. ORM组件 ELinq 更新日志
  5. ORM组件 ELinq 使用答疑
  6. 在我的博客留言,我会尽可能地抽时间来答复大家的问题。
  7. 加入 ELinq用户的 QQ群(271342583)。

   新年伊始,祝大家春节愉快,万事如意,谢谢大家的阅读,麻烦大伙点一下推荐,再次谢谢大家。 ^_^

 
 
分类: ELinq
posted on 2013-02-16 09:35  HackerVirus  阅读(298)  评论(0编辑  收藏  举报