使用CodeSmith 生成代码

CodeSmith是一款优秀的代码生成工具。在ORM中,它能帮助我们生成实体类、XML配置文件,从而简化了我们一部分的开发工作。下面简要说说它的基本用法。

1、  打开CodeSmith,创建一个模板

File->New->CSharp Template 。创建的模板内容如下图

模板中SampleStringProperty 和 SampleBooleanProperty都是声明的变量,在下边代码中都可以用到该变量,我们可以把该模板看做是一个HTML页面,没有用标签圈起来的代码和用<%= %>内部的代码都可以输出到界面上。其中<%= %>与aspx页面中的用法一致。

2、编译代码,给声明的变量赋值

点击红色方框圈住的按钮即可编译模板,模板编译通过后右侧会出现一个Properties的框,在这里面我们可以给我们在模板中定义的变量赋值,如下图所示。

3、运行模板

4、根据数据库生成对应实体层的代码

1、连接数据库

我们创建一个localhost的数据库连接,方法如下图

2、新建一个Entity.cst模板,编写如下模板代码

<%@ CodeTemplate Language="C#" TargetLanguage="C#" ResponseEncoding="UTF-8" Debug="False" Description="生成数据库实体" %>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="属性" Description="要生成实体的数据表" %>
<%@ Property Name="NameSpace" Type="System.String" Optional="False" Default="Modul" Category="属性" Description="实体类所在的命名空间" %>

<%@ Map Name="CSharpAlias" Src="System-CSharpAlias" Description="System to C# Type Map" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>

<%--*本代码由代码生成器自动生成,请不要更改此文件的任何代码。
*生成时间:<%= DateTime.Now.ToLocalTime() %>
*生成者:<%= opuser %>--%>
using System;
namespace <%= this.NameSpace+".Entity.Entities" %>
{
    ///<summary>
    ///表<%= this.SourceTable.Name %>的实体类
    ///</summary>
    public class <%= this.SourceTable.Name %>
    {
        <% foreach(ColumnSchema column in this.SourceTable.Columns){%>    
         <%--生成get set 方法--%>
        /// <summary>
        /// <%= string.IsNullOrEmpty(column.Description)?StringUtil.ToCamelCase(column.Name):column.Description  %>
        /// </summary>
        public virtual <%= CSharpAlias[column.SystemType.FullName] %> <%= StringUtil.ToPascalCase(column.Name) %>
        {
            get;set;
        }
        
        <%}%>
    }
}

在该模板中我们定义了两个变量:SourceTable--该变量存储需要生成的数据库表,NameSpace--生成的代码中对应的命名空间。

3、编译代码,在属性窗口中给SourceTable和NameSpace变量赋值,如下图

4、点击运行即可看到生成的代码。

5、生成的代码存储到指定的文件夹

1、添加一个Main.cst模板,并编写如下代码。

Main.cst与Entity.cst在同一个目录下。代码中有比较全的注释,可以仔细看一下。

<%-- 
Name:
Author: 
Description: 
--%>
<%@ Template Language="C#" TargetLanguage="Text" %>

<%-- 注册实体层Entity模板 --%>
<%@ Register Name="EntityTemplate" Template="Entity.cst" MergeProperties="False" %>


<%@ Property Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema" DeepLoad="True" Optional="False" Description="存数数据库" %>
<%@ Property Name="NameSpace" Type="System.String" Default="BitCar.Finance.CC" Optional="False" Description="命名空间" %>

<%
//创建实体层Entity类
this.GenerateEntityClasses();

Debug.WriteLine("OK");
%>

<script runat="template">
//生成实体Entity类
private void GenerateEntityClasses()
{
    CodeTemplate Template =new EntityTemplate();//实体
    //循环数据数据库中的表
    foreach(TableSchema table in this.SourceDatabase.Tables)
    {
        string FileDirectory = OutputDirectory +"\\Mode\\Entities\\"+ table.Name +".cs";
        //给Entity.cst模板中的变量SourceTable 赋值
        Template.SetProperty("SourceTable",table);
        //给Entity.cst模板中的变量NameSpace 赋值
         Template.SetProperty("NameSpace",NameSpace);
        //文件输出
        Template.RenderToFile(FileDirectory,true);
        Debug.WriteLine(FileDirectory +" 创建成功.");
    }
}

</script>

<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;
} 
}
</script>
<%="全部生成成功" %>

该模板中定义了三个变量:Namespace--指定生成的代码的命名空间,SourceDatabase--存储数据库,Directory--指定生成代码存储的路径(该变量在模板底部定义)

2、编译模板,在属性窗口中给变量赋值,然后生成即可看到生成的代码。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Web技术布道师

Php开发过程中不常碰到的error (2.25更新)

这个不仅存在于页面解析当中,当使用 curl 请求时拼接的参数有这种格式的也会发生转义

13320
来自专栏Web技术布道师

使用 Swoole Server task 处理大数据量异步任务时注意

关于 Buffered Query 和 Unbuffered Query: http://www.php.net/manual/zh/mysqlinfo.con...

25710
来自专栏Web技术布道师

如何设置根据不同的IP地址所在地域访问不同的服务?

目前针对于跨国业务,所以国内外访问的服务可能是不同的(至少不是同一个页面),但域名想要同一个域名,于是想到要区分开访问区域。

24320
来自专栏用户2544583的专栏

Zabbix 检测Mysql数据库的主从同步

在高并发网站架构中,MySQL数据库主从同步是不可或缺的,不过经常会发生由于网络原因或者操作错误,MySQL主从经常会出现不同步的情况,那么如何监控MySQL主...

19240
来自专栏Web技术布道师

MySQL主从复制虽好,能完美解决数据库单点问题吗?

要完成二进制日志的传输过程,MySQL会在从服务器上启动一个工作线程,称为IO线程,这个IO线程会跟主数据库建立一个普通的客户端连接,然后在主服务器上启动一个特...

11910
来自专栏Web技术布道师

MySQL运维实战 之 PHP访问MySQL你使用对了吗

大家都知道,slow query系统做的好不好,直接决定了解决slow query的效率问题

7810
来自专栏Web技术布道师

SMProxy:基于 MySQL 协议,Swoole 开发的 MySQL 数据库连接池

将数据库连接作为对象存储在内存中,当用户需要访问数据库时,首次会建立连接,后面并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。 使用完毕后,用...

14320
来自专栏林德熙的博客

win10 uwp 使用 asp dotnet core 做图床服务器客户端 服务器端客户端

本文告诉大家如何在 UWP 做客户端和 asp dotnet core 做服务器端来做一个图床工具

10920
来自专栏用户2544583的专栏

从Linux系统磁盘空间不足引发的Zabbix服务器数据库迁移

        之前一直没有去关心Zabbbix服务器存储空间问题,最近Zabbix报警提示/根目录磁盘空间不足,于是登录Zabbix看了一下,发现根目录只有1...

23420
来自专栏Web技术布道师

MySQL -- 短连接 + 慢查询

KILL CONNECTION:主动踢除不需要保持的连接(与wait_timeout的效果一样)

11820

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励