且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

CodeSmith实战(一):生成实体层

更新时间:2022-08-31 19:55:13

1.先建立一个生成单个表的实体的模板

<%-- 
Name:
Author: 
Description: 
--%>
<%@ CodeTemplate Language="C#" TargetLanguage="C#" Src="" Inherits="OutputFileCodeTemplate" Debug="False" Description="Template description here." %>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema"  Category="Context"  Optional="True" Description="the table name"   %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Assembly Name="CodeSmith.BaseTemplates" %>
<%@ Import Namespace="CodeSmith.BaseTemplates" %>
<%@ Assembly Name="CodeSmith.CustomProperties" %>
<%@ Import Namespace="CodeSmith.CustomProperties" %>
namespace Jack.CodeSmith.Test
{
      public class <%=this.SourceTable.Name%>Model
    {
        public <%=this.SourceTable.Name%>()
        {
          //ToDo:    
        }
        <%for(int i=0; i<this.SourceTable.NonPrimaryKeyColumns.Count;i++){%>
            private <%=GetCSharpVariableType(this.SourceTable.NonPrimaryKeyColumns[i])%> m<%=this.SourceTable.NonPrimaryKeyColumns[i].Name%>;
        <%}%>
        <%for(int i=0; i<this.SourceTable.NonPrimaryKeyColumns.Count;i++)
        {                   
            int namelength=this.SourceTable.NonPrimaryKeyColumns[i].Name.Length;
            string colName=this.SourceTable.NonPrimaryKeyColumns[i].Name;%>
            public  <%=GetCSharpVariableType(this.SourceTable.NonPrimaryKeyColumns[i])%> <%=colName.Substring(0,1).ToUpper()%><%=colName.Substring(1,colName.Length-1)%>
            get {return m<%=this.SourceTable.NonPrimaryKeyColumns[i].Name%>;}
            set {m<%=this.SourceTable.NonPrimaryKeyColumns[i].Name%>=value;}
        <%}%>        
    }    
}

<script runat="template">
// Override the OutputFile property and assign our specific settings to it.
[FileDialog(FileDialogType.Save, Title="Select Output File", Filter="C# Files (*.cs)|*.cs", DefaultExtension=".cs")]
public override string OutputFile
{
    get {return base.OutputFile;}
    set {base.OutputFile = value;}
}
</script>
<script runat="template">
public string GetCSharpVariableType(ColumnSchema column)
{
    if (column.Name.EndsWith("TypeCode")) return column.Name;
    switch (column.DataType)
    {
        case DbType.AnsiString: return "string";
        case DbType.AnsiStringFixedLength: return "string";
        case DbType.Binary: return "byte[]";
        case DbType.Boolean: return "bool";
        case DbType.Byte: return "byte";
        case DbType.Currency: return "decimal";
        case DbType.Date: return "DateTime";
        case DbType.DateTime: return "DateTime";
        case DbType.Decimal: return "decimal";
        case DbType.Double: return "double";
        case DbType.Guid: return "Guid";
        case DbType.Int16: return "short";
        case DbType.Int32: return "int";
        case DbType.Int64: return "long";
        case DbType.Object: return "object";
        case DbType.SByte: return "sbyte";
        case DbType.Single: return "float";
        case DbType.String: return "string";
        case DbType.StringFixedLength: return "string";
        case DbType.Time: return "TimeSpan";
        case DbType.UInt16: return "ushort";
        case DbType.UInt32: return "uint";
        case DbType.UInt64: return "ulong";
        case DbType.VarNumeric: return "decimal";
        default:
        {
            return "__UNKNOWN__" + column.NativeType;
        }
    }
}
</script>

下面是代码格式化后的截图

 

CodeSmith实战(一):生成实体层

CodeSmith实战(一):生成实体层

CodeSmith实战(一):生成实体层

CodeSmith实战(一):生成实体层

CodeSmith实战(一):生成实体层

2. 再建立一个模板,调用刚才建立的子模板

<%-- 
Name:
Author: 
Description: 
--%>

<%@ CodeTemplate Language="C#" TargetLanguage="C#"  Inherits=""  Description="This is my first data temple" %>
<%@ Property Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema" Category="" Description="Database containing the tables." %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Assembly Name="CodeSmith.BaseTemplates" %>
<%@ Import Namespace="CodeSmith.BaseTemplates" %>
<%@ Assembly Name="CodeSmith.CustomProperties" %>
<%@ Import Namespace="CodeSmith.CustomProperties" %>
<%@ Assembly Name="System.Design" %>
<%@ Import Namespace=" System.Design" %>
<%@ Register Name="SubTemplate" Template="C:\CodeSmithStudy\GenerateModel.cst" MergeProperties="True" ExcludeProperties="" %>
<%
for(int i=0; i<this.SourceDatabase.Tables.Count;i++)
{  
     SubTemplate  mySub=new SubTemplate();
    mySub.OutputFile=this.OutputDirectory+@"\"+this.SourceDatabase.Tables[i].Name+"Model.cs";
    mySub.SourceTable=this.SourceDatabase.Tables[i];
    mySub.Render(Response);        
}

%>

<script runat="template">
private string _outputDirectory = @"c:\codesmithstudy";
[Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor)),
Category("Custom"), Description("Output directory.")]
public string OutputDirectory
{
       get {return _outputDirectory;}
       set {_outputDirectory= value;}
}
</script>

格式化后的截图

CodeSmith实战(一):生成实体层

CodeSmith实战(一):生成实体层

 

3. 从属性窗口选择要保存到的文件夹和数据库

CodeSmith实战(一):生成实体层

4.运行,得到如下结果

CodeSmith实战(一):生成实体层

CodeSmith实战(一):生成实体层

5. 模板下载

http://files.cnblogs.com/cnblogsfans/template.rar

本文转自敏捷的水博客园博客,原文链接http://www.cnblogs.com/cnblogsfans/archive/2008/02/10/1066760.html如需转载请自行联系原作者


王德水