codesmith 如何把选中的多个表生成实体
一、把选中的多个表生成实体
我们会生成一个表的实体类了,那么一次生成多个表的实体类就可以在此基础上实现了��?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>
codesmith 如何把选中的多个表生成实体相关推荐
- Idea groovy表生成实体类带注释
Idea groovy表生成实体类带注释 1.点开datasourse,打开idea带的数据库工具,具体添加数据库连接,这里不描述. 这时点击会生成一个poji 这时生成的pojo中是不带中文注释的, ...
- FreeSql实体映射成数据库,数据库映射成实体类,指定表生成实体
文章目录 codeList DbContext 指定表生成实体 codeList 首先codeList就是一个将实体类映射成数据库表的东西 使用方法: 1.先引入包 补充一下上图:这四个包都要安装 写 ...
- 使用IDEA插件从数据库表生成实体类
目录 1.介绍 2.添加插件 3.创建数据库连接 4.添加数据库连接信息和驱动 5.表生成实体类 1.介绍 EasyCode是基于IntelliJ IDEA Ultimate版开发的一个代码生成插 ...
- typeorm 生成实体类_android常用orm框架greenDAO创建表生成实体类
package com.example.greendao_test.DB_Initialize; import java.io.IOException; import de.greenrobot.da ...
- 在Eclipse中连接数据库、查看数据表、从数据库表生成实体类
第一步:连接数据库 点击Eclipse菜单项"Window",选择"Show View",然后再选择其中的"Data Source Explorer& ...
- CodeSmith模板(生成实体类)
CodeSmith是一款与数据库相关的工具,只要与数据库相关的类都可以通过它编写模板来批量实现. <%@ Template Language="C#" TargetLangu ...
- CodeSmith 5.0工具实例篇系列4——根据表生成修改的存储过程,针对MS Sqlserver
运行该模板时,只需要选择单个表即可. 申明:该系列案例已通过CodeSmith Professional 5.0.1 Revision 4983版本的测试,以及生成的存储过程是针对MS Sqlserv ...
- 图解CodeSmith使用和实用教程一 - 入门和生成MIS项目实体层代码
CodeSmith,也就是传说中的那个代码生成工具. 下载CodeSmith 6.5,可到我网盘下,链接在底部. 一 安装 1 解压,点击安装: 2 协议: 3 选择目录: 4 一路next完成. 5 ...
- mysql数据库表生成jpa注解_Eclipse 通过JPA自动生成注解实体
hibernate是JPA最常用的实现之一,而且hiberante自身也对注释语法进行了支持.现在再不用去看那一堆堆的XML映射了.而且eclipse还提供了从数据库直接生成Entity Class的 ...
最新文章
- boost::hana::unpack用法的测试程序
- 华为手机刷linux系统,华为Harmony OS 2.0手机Beta版刷机包流出:电脑助手一键刷入/手动...
- 在CentOS上安装ZooKeeper集群
- smart filter无法从smart business应用获得值的问题分析
- 领域应用 | 从本体论开始说起——运营商关系图谱的构建及应用
- 信息学奥赛C++语言: 素数的统计
- Java生产环境下性能监控与调优详解 第4章 基于Btrace的监控调试
- 一个普通handler会持有activity引用吗_详解handler机制
- 测试理论----测试设计方法论
- Ubuntu杀死进程
- boosting算法调参
- 主板有电无法启动_【主板不通电无法开机】主板不通电怎么修_主板通电但是开不了机...
- jvm虚拟机规范 紧接上文的
- 【每日早报】2019/07/01
- Linux下C语言实现TCP文件传输
- 计算机知识竞赛口号,知识竞赛口号霸气押韵
- matlab例题(阶乘,解方程,数字加密输出)
- 移动端 --- 区分苹果终端和安卓终端
- python数字规律分析_【小白学爬虫】用Python分析福彩3D|发现数字的秘密
- xorm reverse
热门文章
- 信息学奥赛一本通(2050:【例5.20】字串包含)
- 信息学奥赛一本通(1007:计算(a+b)×c的值)
- C++语言基础 —— STL —— 容器与迭代器 —— list 与 deque
- 暑期训练日志----2018.8.15
- 26 CO配置-控制-产品成本控制-成本对象控制-期末结算-定义结果分析版本
- 47 FI配置-财务会计-固定资产-一般评估-定义资产分类中的折旧范围
- java内存shell_Springboot 内存shell
- python热成像_盘点Terabee传感器家族:TOF测距、3D相机、热成像
- tensorflow saver_机器学习入门(6):Tensorflow项目Mnist手写数字识别-分析详解
- track_info分区表的创建并将ETL的数据加载到Hive表