.Net框架搭建之辅助模版代码生成工具

在.Net框架搭建讲解中,提到了代码自动生成来减少开发人员人工作量,比如数据库对应的Model、最基层的Repository类和接口等等,除了类名不一样,其他都一样,没必要再手写一遍。
我在这里,介绍使用CodeSmith模版生成Model类,其他的都一样,拿到表名和各字段名、字段类型等等,想怎么生成就能怎么生成。

首先,在硬盘中,建立一个文件夹,用来放模版文件,比如:
F:\pukuimin\InjectExample\ExampleCodeSmithTemplate
点击添加文件夹位置,把这个文件夹加到CodeSmith管理器

好了之后,就可以新建模版文件了,在刚加的文件夹上右键,新建CS类型模版文件。

重命名为 Model.cst
内容:

<%--
Name:
Author: pukuimin
Description:
--%>
<%@ Template Language="C#" TargetLanguage="C#" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.Globalization" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Map Name="CSharpAlias" Src="System-CSharpAlias" Description="数据库字段类型与C#类型的映射表" %>

<%-- 要打印的表 --%>
<%@ Property Name="Table"  Type="SchemaExplorer.TableSchema" DeepLoad="True" Optional="False" Category="需要的数据表" Description="table ." %>
<%
string TableName=Table.Name;
/*
for(int i=TableName.Length-1;i>=0;i--)
{
    if(TableName[i]>='A'&& TableName[i]<='Z')
    {
        TableName=TableName.Substring(0,i)+TableName.Substring(i,1).ToLower()+TableName.Substring(i+1);
        break;
    }
}
*/
string primaryname=Table.PrimaryKey.MemberColumns[0].Name;
string primarytype= CSharpAlias[Table.PrimaryKey.MemberColumns[0].SystemType.FullName];
string autoname="",autotype="";
 foreach(ColumnSchema cs in Table.Columns)
 {
     if( ((bool)cs.ExtendedProperties["CS_IsIdentity"].Value) == true)
     {
        autoname=cs.Name;
        autotype=CSharpAlias[cs.SystemType.FullName];
         break;
     }
 }
List<string> fkeys=new List<string>();//存储外键列及对应的主键表名
foreach(var item in Table.ForeignKeys)
{
    fkeys.Add(item.ForeignKeyMemberColumns[0].Name);
    //Response.Write(item.ForeignKeyMemberColumns[0].Name+"--"+item.PrimaryKey.Table.Name+"\n");
}
%>
/* ==============================================================================
 * 功能描述:SysUserInfo
 * 创 建 者:蒲奎民
 * 创建日期:2016-08-29 15:58:13
 * CLR Version :4.0.30319.42000
 * ==============================================================================*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace InjectExample.Model
{
    public partial class <%=Table.Name%>
    {
             <% for(int i=0;i<Table.Columns.Count;i++) {
             ColumnSchema col=Table.Columns[i];
             string temptype=CSharpAlias[col.SystemType.FullName];
              %>
        /// <summary>
        /// <%=col.Description==""?col.Name:col.Description %>
        /// </summary>
        public <%=temptype+(col.AllowDBNull&&temptype!="string"?"?":"")%> <%=col.Name%> { get; set; }

                <%

                }
                %>
    }
}

保存,然后,点击工具栏的Build Template,生成一下。
右下角会有选择数据库表,我们就需要添加数据库。

添加数据库,再选择库中的一张表。

选择好了之后,点击工具栏的 Generate 生成model内容了。

生成的内容:

这个代码就能直接使用了,如果不能用,要自己改改模版。

其他模版不一一介绍,大家可以参考此模版改造。

再加一个,把模版生成的代码直接保存到文件的CS模版。

模版内容:

<%--
Name:GenerateFiles.cst
Author: pukuimin
Description: 生成并输出cs文件的模版
--%>
<%@ Template Language="C#" TargetLanguage="Text" Inherits="CodeTemplate" Encoding="utf-8"%>
<%@ Assembly Name="SchemaExplorer"%>
<%@ Import Namespace="SchemaExplorer"%>

<%-- 数据库 --%>
<%@ Property Name="SourceDatabase"  Type="SchemaExplorer.DatabaseSchema" DeepLoad="True" Optional="False" Category="需要的数据库" Description="Database"%>
<%-- 注册实体层Model模板 --%>
<%@ Register Name="ModelTemplate" Template="Model.cst" MergeProperties="Flase" ExcludeProperties=""%>
<script runat="template">
    //解决方案输出路径
     private string Directory = String.Empty;
    [Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))]
    [Optional, NotChecked]
    [DefaultValue("")]
    public string OutputDirectory
    {
        get
        {
            return Directory;
        }
        set
        {
            if (value.EndsWith("\\")) value = value.Substring(0, value.Length -1);
            Directory = value;
        }
    }
    public string GetSubspace(string tableName)
    {

        for(int i=tableName.Length-1;i>=0;i--)
        {
            if(tableName[i]>='A'&& tableName[i]<='Z')
            {
                tableName=tableName.Substring(0,i)+tableName.Substring(i,1).ToLower()+tableName.Substring(i+1);
                break;
            }
        }
        return tableName;
    }
        //生成实体Entity类
    private void GenerateEntityClasses()
    {
        CodeTemplate modelTemplate =new ModelTemplate();

        foreach(TableSchema table in this.SourceDatabase.Tables)
        {
            string TableName=table.Name;
            string subspace=GetSubspace(TableName);
            if(TableName!="") continue;//可以指定只生成一个表,不等于这个表名就跳过生成,为空就生成所有表
            //#error 上面行修改成要生成的表名(修改后可注释本行)
            Response.WriteLine("……………………"+TableName +" 开始生成……………………");

            string modelDirectory = OutputDirectory +"\\InjectExample.Model\\"+TableName+".cs";

            //生成Model.cs模板文件
            modelTemplate.SetProperty("Table",table);
            modelTemplate.RenderToFile(modelDirectory,true);//文件输出
            Response.WriteLine(modelDirectory +" 创建成功.");

            Response.WriteLine("……………………"+TableName +" 完成生成……………………");
        }
    }
</script>
<%
    //创建实体层Entity类
    this.GenerateEntityClasses();
    Debug.WriteLine("全部生成完成!");
    Response.WriteLine("全部生成完成!");
%>

点击生成之后,在你选择的目录下,就直接生成了Model.cs文件,连创建新文件都省了。

版权声明:
作者:真爱无限
出处:http://blog.csdn.net/pukuimin1226/
本文为博主原创文章版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接.

时间: 2024-08-03 21:56:52

.Net框架搭建之辅助模版代码生成工具的相关文章

Database2Sharp代码生成工具使用心得

Database2Sharp是一款主要用于C#代码以及数据库文档生成的工具,软件支持Oracle.SqlServer.MySql.Access.Sqlite等数据库的代码生成,可以生成各种架构代码.生成Winform界面代码.Web界面代码.导出数据库文档.浏览数据库架构.查询数据.生成Sql脚本等,还整合自定义模板和数据库信息的引擎,方便编写自定义模板调试和开发. 1.EnterpriseLibrary架构代码生成 1.1 代码生成总体概述 EnterpriseLibrary代码生成时一个整体

代码生成工具之界面快速生成

界面开发,无论对于Web开发,还是Winform开发,都需要耗费一定的时间,特别对于一个数据库字段比较多的界面,一般就需要在编辑界面上摆的更多的控件来做数据显示,每次碰到这个,都有点头痛,反复的机械操作让人挺累,也很烦,但是又必须这样做. 由于数据库字段和界面的排版都有一定的关联关系,因此可以通过代码生成工具Database2Sharp的数据库元数据,包含表名称.备注信息.字段列表,以及每个字段的名称.备注.类型等信息,构造一个基础的界面,把重复机械的部分给快速完成,这就是我所说的界面快速生成.

asp.net微信公众平台开发(二) 多层架构框架搭建和入口实现

上篇已经设计出比较完善的数据库了,这篇开始进入代码.  首先把上篇设计的数据库脚本在数据库中执行下,生成数据库,然后在VS中建立项目,为了方便理解和查看,我设计的都是很直白的类名和文件名,没有命名空间前缀. 采用接口方式,共8个项目:7个类库和一个MVC项目,  分别为: 显示层--MVC项目 业务逻辑层--访问接口IBLL.具体实现BLL 数据访问层--访问接口IDAL.具体实现DAL 数据(模型)--DataModel 通用方法--Common 仓储--Factory 这里的仓储并不为了生产

.Net框架搭建之2、SQL Server MEF依赖注入 MVC Repository框架

MEF依赖注入简介 依赖注入对于开发人员来说,方便的就是不需要去关注具体的实现类,不需要去New实例对象,直接使用接口层就能让程序自动注入使用,当然,还有其他一些特点,比如web http同一个请求中可以设置同一个对象只实例化一次解决多个类中多次实例化对象浪费资源的问题.不多说,百度能得到更多 多的介绍,这边直接开工搭环境. 1.数据模型Model层创建 数据模型层,首先要创建数据库,再创建Model类. 创建数据库,表,添加一条测试数据 创建数据库 创建数据表 添加测试数据 我们已经知道有几层

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    (5):前台Jquery easyUI实现    (6):EF上下文实例管理    (7):DBSession的封装   (8):DBSession线程内唯一     (9):TT摸版的学习    (1

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) 前言:这篇博客开始我们便一步一步的来实现这个权限系统的初步设计-框架搭建,首先我要说的是我们需要开发工具Visual Studio 2012或者10也行,其次是我们要有SQL Server数据库,如果是Visual Studio 2010的话,你还要安装MVC4的开发文件,这个是吗?我不记得了,谁可以回答我一下的,我一直用2012,都是集成

Thinkphp自定义代码生成工具及用法说明(附下载地址)_php实例

本文实例讲述了Thinkphp自定义代码生成工具及用法说明.分享给大家供大家参考,具体如下: 我最近沮丧的发现在使用Thinkphp很多时候我都在做重复的事情,比如重复写最简单的CRUD方法,编写表单,写前台样式表等等. Thinkphp对于后台操作的支持已经非常强大,再加上最近非常流行的Bootstrap框架让前台样式也变得容易遵循一个标准,于是我决定开始写一个属于自己的代码生成器. 我希望它操作足够简单,让人一看就懂,对MySql和Sqlite数据库都能够稳定生成CRUD代码就好,还如果还能

onvif开发实战2--总结框架搭建

完成框架搭建后,编写自己的主函数起onvif服务 编写makefile objs = onvif.o onvif_func.o duration.o soapC.o soapServer.o stdsoap2.o onvif:$(objs)    gcc -o onvif $(objs) .PHONY:cleanclean:    #-rm onvif    rm *[!C.o].o   发现提示好多函数没有定义,在头文件soapStub.h中定义的,直接把没有定义的函数声明拷贝到一个onvif

Thinkphp自定义代码生成工具及用法说明(附下载地址)

本文实例讲述了Thinkphp自定义代码生成工具及用法说明.分享给大家供大家参考,具体如下: 我最近沮丧的发现在使用Thinkphp很多时候我都在做重复的事情,比如重复写最简单的CRUD方法,编写表单,写前台样式表等等. Thinkphp对于后台操作的支持已经非常强大,再加上最近非常流行的Bootstrap框架让前台样式也变得容易遵循一个标准,于是我决定开始写一个属于自己的代码生成器. 我希望它操作足够简单,让人一看就懂,对MySql和Sqlite数据库都能够稳定生成CRUD代码就好,还如果还能