一、把选中的多个表生成实体
我们会生成一个表的实体类了,那么一次生成多个表的实体类就可以在此基础上实现了��?br> 实现思路��?/strong>
在前面我们制作的实体类生成模板只能生成一个表,现在我们编写一个新的模板,在该模板中注册原来实体类模板。这样我们就可以在这个新的模板中生成多个原实体类模板的对象,然后调用原对象的呈现方法,来生成代码
例:己有一个实体类生成模板EntitySingle.cst,现在我们制作一个新的模板,并在新模板中注册EntitySingle.cst模板
<%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" Description="" %>
<%@ Property Name="TDB" Type="SchemaExplorer.TableSchemaCollection" Default="" Optional="False" Category=""%>
<%@ Register Name="SE" Template="EntitySingle.cst" MergeProperties="False" ExcludeProperties="" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Assembly Name="System.Data" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Collections" %>
<%
foreach(TableSchema ts in TDB)
{
SE s = new SE();
s.TTable = ts;
s.Render(this.Response);
}
%>
<script runat="template">
</script>
说明��?br> <%@ Register Name="SE" Template="EntitySingle.cst" MergeProperties="False" ExcludeProperties="" %>
这句就是把EntitySingle.cst注册到当前模板中,名称是SE��?br>
<%@ Property Name="TDB" Type="SchemaExplorer.TableSchemaCollection" Default="" Optional="False" Category=""%>
这句定义了一个表集合的属性,以便用户从中选择多个表来生成它们的实体类
SE s = new SE();
实例化SE这个模板对象
s.TTable = ts;
为EntitySingle.cst模板实例中的TTable属性进行赋��?br>
s.Render(this.Response);
调用SE对象(EntitySingle.cst模板实例)的呈现方法,把该表的实体类代码生成出来
运行结果
二、把单个表的实体类生成到文件中去
上面的例子中虽然可以同时生成多个实体类,但是它全都显示在右边��?b style="color:black;background-color:#a0ffff">输出区域,还需要我们收动复制粘贴放到源文件中去。这里我们主要研究如何把生成的代��?b style="color:black;background-color:#a0ffff">输出到指定的文件中去��?br> ��?b style="color:black;background-color:#ffff66">CodeSmith中,CodeTemplate.Render方法用来修改CodeSmith输出时的事件处理。可以通过重写Render方法来修改模��?b style="color:black;background-color:#a0ffff">输出时的方式��?br> Render方法��?br> public override void Render(TextWriter writer)
{}
例:在模板的默认输出的基础上,加上把结��?b style="color:black;background-color:#a0ffff">输出到文件的功能
public override void Render(TextWriter tw)
{
StreamWriter fs1 = new StreamWriter("c:\\"+TTable.Name.ToString()+".cs",true);
this.Response.AddTextWriter(fs1);
base.Render(tw);
fs1.Close();
}
说明:这里一定要加入base.Render(tw)的调用,否则得不到默认的输出��?br>
FileNameEditor类:
FileNameEditor类给我们提供了在CodeSmith属性面板中弹出打开或保存文件对话框的方式,在使用时,首先在模版中得添加对程序集CodeSmith.CustomProperties的引用。然后就可以在模版中定义一个属性来使用FileNameEditor��?br> <%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" Description="" %>
<%@ Assembly Name="CodeSmith.CustomProperties" %>
<%@ Import Namespace="CodeSmith.CustomProperties" %>
<script runat="template">
private string _filename;
[Editor(typeof(FileNameEditor),typeof(System.Drawing.Design.UITypeEditor)),FileDialogAttribute(FileDialogType.Save,Title="save as",Filter="C# File|(*.cs)")]
public string TargetFileName
{
get
{
return _filename;
}
set
{
_filename = value;
}
}
</script>
FileDialogAttribute类:设置对话框的样式
FileDialogType:对话框的方��?打开/关闭),如:FileDialogType.Save
Filter:文件类型过滤器,如:Filter="C# File|(*.cs)"
Title:对话框的标题。如:Title="保存"
DefaultExtension:文件默认的扩展��?br> CheckFileExists:true-只能选择己存在的文件
CheckPathExists:true-只允许使用己存在路径
以下代码将生成的实体��?b style="color:black;background-color:#a0ffff">输出到对应的.CS文件中去
<%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" Description="Template description here." %>
<%@ Property Name="TTable" Type="SchemaExplorer.TableSchema" Default="" Optional="False" Category="" Description="" OnChanged="" Editor="" EditorBase="" Serializer="" %>
<%@ Assembly Name="CodeSmith.CustomProperties" %>
<%@ Assembly Name="System.Data" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="CodeSmith.CustomProperties" %>
using System;
<%
string classname = TTable.Name.ToUpper().Substring(0,1)+TTable.Name.ToLower().Substring(1,TTable.Name.Length-1);
string entitytype="";
string entityname="";
%>
public class <%=classname%>Data
{
<%for(int i=0;i<TTable.Columns.Count;i++){%>
<%if(!TTable.Columns[i].IsForeignKeyMember){%>
private <%=CreateColumnType(TTable.Columns[i])%> _<%=TTable.Columns[i].Name.ToLower()%>;
<%}
else
{
foreach(TableKeySchema tks in TTable.ForeignKeys)
{
foreach(MemberColumnSchema mcs in tks.ForeignKeyMemberColumns)
{
if(mcs.Name == TTable.Columns[i].Name)
{
entityname = tks.PrimaryKeyTable.Name.ToUpper().Substring(0,1)+tks.PrimaryKeyTable.Name.ToLower().Substring(1,tks.PrimaryKeyTable.Name.Length-1);
entitytype = entityname+"Data";
break;
}
}
}
%>
private <%=entitytype%> _<%=entityname.ToLower()%>;
<%}%>
<%if(!TTable.Columns[i].IsForeignKeyMember){%>
public <%=CreateColumnType(TTable.Columns[i])%> <%=TTable.Columns[i].Name.ToUpper().Substring(0,1)+TTable.Columns[i].Name.ToLower().Substring(1,TTable.Columns[i].Name.Length-1)%>
{
get
{
return _<%=TTable.Columns[i].Name.ToLower()%>;
}
set
{
_<%=TTable.Columns[i].Name.ToLower()%> = value;
}
}
<%}else{%>
public <%=entitytype%> <%=entityname.ToUpper().Substring(0,1)+entityname.ToLower().Substring(1,entityname.Length-1)%>
{
get
{
return _<%=entityname.ToLower()%>;
}
set
{
_<%=entityname.ToLower()%> = value;
}
}
<%}%>
<%}%>
}
<script runat="template">
private string _savefile;
[Editor(typeof(FileNameEditor),typeof(System.Drawing.Design.UITypeEditor)),FileDialogAttribute(FileDialogType.Save,Title="save as",Filter="C# File|(*.cs)")]
public string SaveFile
{
get
{
return _savefile;
}
set
{
_savefile = value;
}
}
public override void Render(TextWriter tw)
{
StreamWriter fs1 = new StreamWriter(_savefile,true);
this.Response.AddTextWriter(fs1);
base.Render(tw);
fs1.Close();
}
private string CreateColumnType(ColumnSchema cs)
{
switch(cs.DataType)
{
case DbType.AnsiString:
case DbType.String:
return "string";
case DbType.Binary:
return "byte[]";
case DbType.Boolean:
return "bool";
case DbType.Date:
case DbType.DateTime:
case DbType.Time:
return "DateTime";
case DbType.Int16:
case DbType.Int32:
case DbType.Int64:
case DbType.UInt16:
case DbType.UInt32:
case DbType.UInt64:
return "int";
default:
return "object";
}
}
</script>
三、将多个表的实体类生成到文件中去
将多个表的实体类生成到文件中去实际上是把上面两种方法进行结合��?br> 思路��?/strong>
1.建立能够生成一个实体类的模板A,并设置一个TableSchema属性和文件路径属��?br> 2.建立另一个模板B,其中注册引用上面的实体类模��?br> 3.在模板B中加入一个TableSchemaCollection的属性,以选择对哪些表生成实体��?br> 4.在模板B中加入一个属性用以选择将生成的实体类文件放在哪个目录中
5.在模板B中生成模板A的实例,并为模板A的两个属性赋��?br> 6.设用Render方法实现输出
FolderNameEditor类:路径选择对话��?br> <script runat="template">
private string _filename;
[Editor(typeof(System.Windows.Forms.Design.FileNameEditor),typeof(System.Drawing.Design.UITypeEditor))]
public string TargetFileName
{
get
{
return _filename;
}
set
{
_filename = value;
}
}
代码��?br> <%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" Description="Template description here." %>
<%@ Property Name="tb" Type="SchemaExplorer.TableSchemaCollection" Default="" Optional="True" Category="Strings" Description="This is a sample string property." %>
<%@ Register Name="sge" Template="Entitysingle.cst" MergeProperties="False" ExcludeProperties="" %>
<%@ Assembly Name="CodeSmith.CustomProperties" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Assembly Name="System.Data" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Windows.Forms.Design" %>
<%@ Import Namespace="CodeSmith.CustomProperties" %>
<%
foreach(TableSchema ts in tb)
{
sge s = new sge();
s.TTable = ts;
s.SaveFile = this.GeneratePath+"\\"+s.TTable.Name.ToString()+".cs";
s.Render(this.Response);
}
%>
<script runat="template">
private string _path;
[Editor(typeof(System.Windows.Forms.Design.FolderNameEditor),typeof(System.Drawing.Design.UITypeEditor))]
public string GeneratePath
{
get
{
return _path;
}
set
{
_path = value;
}
}
</script>