会对一类文件创建一个模版,比如Entity。然后调用数据库的表,每个表建立一个Entity实体的cs文件。如何实现呢?
首先我们将定义好Entity的模板。如下:
<%-- Name: Author: Description: --%> <%@ Template Language="C#" TargetLanguage="C#" %> <%@ Assembly Name="SchemaExplorer" %> <%@ Import Namespace="SchemaExplorer" %> <%@ Property Name="NameSpace" Default="Beyondbit.Personal.Email" Type="System.String" %> <%@ Property Name="表" Type="SchemaExplorer.TableSchema" Category="数据源" Description="需要生成的表" %> //---------------------------------------------------------------- // Copyright (C) 2012 上海互联网软件有限公司 // 版权所有。 // All rights reserved. // // 文件名: // 文件功能描述: // // // 创建标识: // // 修改标识: // 修改描述: //---------------------------------------------------------------- using System; namespace <%=NameSpace%>.Entity { /// <summary> /// 作者:Administrator 2012-06-27 3:29:59 PM /// </summary> [Serializable] public sealed class <%= 表.Name %> { #region 私有成员变量 <% for (int i = 0; i < 表.Columns.Count; i++) { %> private <%=GetFieldType(表.Columns[i])%> _<%= 表.Columns[i].Name %>=<%=GetFieldValue(表.Columns[i])%>; <% } %> #endregion #region 成员属性 <% for (int i = 0; i < 表.Columns.Count; i++) { %> /// <summary> /// <%= 表.Columns[i].Name %> /// </summary> public <%=GetFieldType(表.Columns[i])%> <%= 表.Columns[i].Name %> { get { return _<%= 表.Columns[i].Name %>; } set { _<%= 表.Columns[i].Name %> = value; } } <% } %> #endregion } } <script runat="template"> public string GetFieldType(ColumnSchema column) { string param = "String"; switch (column.DataType) { case DbType.Int32: { param ="int"; break; } default: { break; } } return param; } public string GetFieldValue(ColumnSchema column) { string param = "String.Empty"; switch (column.DataType) { case DbType.Int32: { param ="0"; break; } default: { break; } } return param; } </script>可以看到,该模版需要2个参数
NameSpace和表
接下来,我们看如何在另外一个模版中,用这个模版生成CS文件。
在另外一个模版中,如下设置:
<%@ Assembly Name="SchemaExplorer" %> <%@ Assembly Name="System.Design" %> <%@ Import Namespace="SchemaExplorer" %> <%@ Property Name="RootNamespace" Default="Test" Type="System.String" %> <%@ Property Name="SourceDatabase" Type="SchemaExplorer.TableSchemaCollection" Category="数据源" Description="需要生成的表" %><% //生成实体 foreach (TableSchema table in SourceDatabase) { OutputSubTemplate(table); }public void OutputSubTemplate(TableSchema table) {CodeTemplateCompiler compiler = new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName + "Entity.cst"); compiler.Compile();MySubTemplate.SetProperty("表", table); MySubTemplate.RenderToFile(OutputDirectory+RootNamespace+"/"+table.Name+"Entity.cs",true); }CodeTemplate MySubTemplate= compiler.CreateInstance();
%>
还有一种方法,直接在另外一个模版中直接注册子模版,如下设置:
Format:HTML FormatVersion:1.0StartHTML: 165EndHTML: 10171StartFragment: 314EndFragment: 10139StartSelection: 314EndSelection: 314
<%-- Name: Author: Description: --%> <%@ Template Language="C#" TargetLanguage="Text" %> <%@ Assembly Name="SchemaExplorer" %> <%@ Assembly Name="System.Design" %> <%@ Import Namespace="SchemaExplorer" %> <%@ Property Name="RootNamespace" Default="Test" Type="System.String" %> <%@ Property Name="SourceDatabase" Type="SchemaExplorer.TableSchemaCollection" Category="数据源" Description="需要生成的表" %> <%-- 注册实体层Entity模板 --%> <%@ Register Name="AssemblyInfoTemplate" Template="AssemblyInfo.cst" MergeProperties="Flase" ExcludeProperties=""%> <% //生成实体 foreach (TableSchema table in SourceDatabase) { OutputSubTemplate(table); } //生成项目 CodeTemplateCompiler compiler = new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName + "EntityProject.cst"); compiler.Compile(); CodeTemplate ProjectTemplate = compiler.CreateInstance(); ProjectTemplate.SetProperty("SourceDatabase",SourceDatabase); ProjectTemplate.SetProperty("RootNamespace",RootNamespace); ProjectTemplate.RenderToFile(OutputDirectory+RootNamespace+"/"+RootNamespace+".csproj",true); //生成AssemblyInfo ProjectTemplate= new AssemblyInfoTemplate(); ProjectTemplate.SetProperty("RootNamespace",RootNamespace); ProjectTemplate.RenderToFile(OutputDirectory+ RootNamespace+"/Properties/AssemblyInfo.cs",true); //生成解决方案 compiler = new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName + "SLN.cst"); compiler.Compile(); ProjectTemplate = compiler.CreateInstance(); ProjectTemplate.SetProperty("RootNamespace",RootNamespace); ProjectTemplate.RenderToFile(OutputDirectory+ RootNamespace+".sln",true); %> <script runat="template"> private string _outputDirectory = String.Empty; [Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))] [Optional] [Category("Output")] [Description("The directory to output the results to.")] public string OutputDirectory { get { // default to the directory that the template is located in if (_outputDirectory.Length == 0) return this.CodeTemplateInfo.DirectoryName + "output\\"; return _outputDirectory; } set { if (!value.EndsWith("\\")) value += "\\"; _outputDirectory = value; } } private CodeTemplate _mySubTemplate; [Browsable(false)] public CodeTemplate MySubTemplate { get { if (_mySubTemplate == null) { CodeTemplateCompiler compiler = new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName + "Entity.cst"); compiler.Compile(); if (compiler.Errors.Count == 0) { _mySubTemplate = compiler.CreateInstance(); } else { for (int i = 0; i < compiler.Errors.Count; i++) { Response.WriteLine(compiler.Errors[ i].ToString()); } } } return _mySubTemplate; } } public void OutputSubTemplate(TableSchema table) { MySubTemplate.SetProperty("表", table); MySubTemplate.RenderToFile(OutputDirectory+RootNamespace+"/"+table.Name+"Entity.cs",true); } </script>
注意:Format:HTML FormatVersion:1.0StartHTML: 165EndHTML: 415StartFragment: 314EndFragment: 383StartSelection: 314EndSelection: 314
AssemblyInfoTemplate
是通过注册方式,引入的另外一个模版。