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、編譯模板,在屬性窗口中給變量賦值,然后生成即可看到生成的代碼。
原文參考:http://www.cnblogs.com/huangcong/archive/2010/06/14/1758201.html