很久没有使用CodeSmith代码生成工具了,不知道现在还有没有人在用哦,最近准备做个个人博客系统,从使用Powerdesigner设计数据库开始,CodeSmith生成架构,然后慢慢实现博客系统搭建。
由于以前没有做过CodeSmith笔记,用的又少,几乎不会自定义模板的生成简单的实体类 ==||,本来很多大牛写了N篇技术文章了,看了N遍总觉得是别人的东西,个人觉得还是有必要自己动手多记几笔,以备以后之用……
废话不多说了,马上进入CodeSmith的温习中吧……
首先启动CodeSmith,新增一个要用来生成实体的 DataBase
再在右边打开TemplateExplorer面板,点击My CodeSmith Templates 新建自己的Template模板 (MyBlog.cst):
在MyBlog模板中,加上如下代码:
<%-- Name: Author: Description: --%> <%@ CodeTemplate Language="C#" TargetLanguage="C#" Src="" Inherits="CodeTemplate" Debug="False" CompilerVersion="v3.5" Description="Template description here." %> <%-- 必须引用的SchemaExplorer命名空间--%> <%@ Assembly Name="SchemaExplorer"%> <%@ Import Namespace="SchemaExplorer"%> <%-- DB(数据库) --%> <%@ Property Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema" Default="" Optional="True" Category="Strings" Description="This is a sample string property." %>
<%@ CodeTemplate Language="C#" TargetLanguage="C#" Src="" Inherits="CodeTemplate" Debug="False" CompilerVersion="v3.5" Description="Template description here." %>
Language : 表示使用的编程语言 TargetLanguage:目标语言 (默认的Text也可以)
<%@ Property Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema" Default="" ……
声明一个链接数据库的属性,Build后,即可从右侧的Properties中选择要连接的数据库。(按提示操作)
完成链接数据库的操作后,新建一个Entity.cst模板,和MyBlog.cst保存在同一个文件夹中。
Entity模板比较简单,就简单地生成单个实体类的代码:
<%-- Name: Author: Description: --%> <%@ CodeTemplate Language="C#" TargetLanguage="C#" Src="" Inherits="CodeTemplate" Debug="False" CompilerVersion="v3.5" Description="Template description here." %> <%@ Assembly Name="SchemaExplorer"%> <%@ Import Namespace="SchemaExplorer"%> <%@ Property Name="Table" Type="TableSchema" Default="" Optional="False" Category="Context" Description="" OnChanged="" Editor="" EditorBase="" Serializer="" %> using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyBlogEntity { public class <%=Table.Name%> { <%foreach(ColumnSchema col in Table.Columns){%> public <%=col.DataType%> <%=col.Name%> { get; set; } <%}%> } } <script runat="template"> // My methods here. </script>
然后在MyBlog模板中注册下Entity模板:
<%--注册Entity实体--%> <%@ Register Name="EntityTemplate" Template="Entity.cst" MergeProperties="False" ExcludeProperties="" %>
注册完后,就可以在MyBlog中选择Build,生成成功后,然后就可以选择输出路径,Run一下,就可以生成所有的表对应的实体类了。
这只是简单地实体类的生成,如果要生成包含增删改查的业务逻辑,直接在模板方法中新增自己的方法,就可以生成自己定义的任何类型。
附上这两个文件的代码:
MyBlog.cst:
<%-- Name: Author: Description: --%> <%@ CodeTemplate Language="C#" TargetLanguage="C#" Src="" Inherits="CodeTemplate" Debug="False" CompilerVersion="v3.5" Description="Template description here." %> <%-- 必须引用的SchemaExplorer命名空间--%> <%@ Assembly Name="SchemaExplorer"%> <%@ Import Namespace="SchemaExplorer"%> <%-- DB(数据库) --%> <%@ Property Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema" Default="" Optional="True" Category="Strings" Description="This is a sample string property." %> <%--注册Entity实体--%> <%@ Register Name="EntityTemplate" Template="Entity.cst" MergeProperties="False" ExcludeProperties="" %> <% //创建实体类 OutPutFile("Model","MyBlog"); Debug.Write("全部创建完毕!!"); %> <script runat="template"> // My methods here. public string SampleMethod() { return "Method output."; } //解决方案输出路径(通用方法) 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 void OutPutFile(string modelName,string projectName) { //创建一个Template(模板) CodeTemplate codeTm=new EntityTemplate(); foreach(TableSchema table in SourceDatabase.Tables)//循环数据库中的多个表 { string fileOutPutPath=string.Format("{0}\\{1}\\{2}\\{3}.cs",this.Directory,projectName,modelName,table.Name); //生成模板 codeTm.SetProperty("Table",table); //文件输出RenderToFile方法 codeTm.RenderToFile(fileOutPutPath,true); Debug.WriteLine("---------------创建"+table.Name+"成功!---------------------------"); } } </script>
Entity.cst:
<%-- Name: Author: Description: --%> <%@ CodeTemplate Language="C#" TargetLanguage="C#" Src="" Inherits="CodeTemplate" Debug="False" CompilerVersion="v3.5" Description="Template description here." %> <%@ Assembly Name="SchemaExplorer"%> <%@ Import Namespace="SchemaExplorer"%> <%@ Property Name="Table" Type="TableSchema" Default="" Optional="False" Category="Context" Description="" OnChanged="" Editor="" EditorBase="" Serializer="" %> using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyBlogEntity { public class <%=Table.Name%> { <%foreach(ColumnSchema col in Table.Columns){%> public <%=col.DataType%> <%=col.Name%> { get; set; } <%}%> } } <script runat="template"> // My methods here. </script>
选择的输出路径为OutputDirectory F:
模板中拼的地址是 F:\MyBlog\Model,所以生成的所有实体类,直接可以从这个地址去找到。