- 浏览: 2158838 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1878)
- [网站分类]ASP.NET (141)
- [网站分类]C# (80)
- [随笔分类]NET知识库 (80)
- [随笔分类]摘抄文字[非技术] (3)
- [随笔分类]养生保健 (4)
- [网站分类]读书区 (16)
- [随笔分类]赚钱 (7)
- [网站分类].NET新手区 (233)
- [随笔分类]网站 (75)
- [网站分类]企业信息化其他 (4)
- [网站分类]首页候选区 (34)
- [网站分类]转载区 (12)
- [网站分类]SQL Server (16)
- [网站分类]程序人生 (7)
- [网站分类]WinForm (2)
- [随笔分类]错误集 (12)
- [网站分类]JavaScript (3)
- [随笔分类]小说九鼎记 (69)
- [随笔分类]技术文章 (15)
- [网站分类]求职面试 (3)
- [网站分类]其他技术区 (6)
- [网站分类]非技术区 (10)
- [发布至博客园首页] (5)
- [网站分类]jQuery (6)
- [网站分类].NET精华区 (6)
- [网站分类]Html/Css (10)
- [随笔分类]加速及SEO (10)
- [网站分类]Google开发 (4)
- [随笔分类]旅游备注 (2)
- [网站分类]架构设计 (3)
- [网站分类]Linux (23)
- [随笔分类]重要注册 (3)
- [随笔分类]Linux+PHP (10)
- [网站分类]PHP (11)
- [网站分类]VS2010 (2)
- [网站分类]CLR (1)
- [网站分类]C++ (1)
- [网站分类]ASP.NET MVC (2)
- [网站分类]项目与团队管理 (1)
- [随笔分类]个人总结 (1)
- [随笔分类]问题集 (3)
- [网站分类]代码与软件发布 (1)
- [网站分类]Android开发 (1)
- [网站分类]MySQL (1)
- [网站分类]开源研究 (6)
- ddd (0)
- 好久没写blog了 (0)
- sqlserver (2)
最新评论
-
JamesLiuX:
博主,能组个队么,我是Freelancer新手。
Freelancer.com(原GAF – GetAFreelancer)帐户里的钱如何取出? -
yw10260609:
我认为在混淆前,最好把相关代码备份一下比较好,不然项目完成后, ...
DotFuscator 小记 -
日月葬花魂:
大哥 能 加我个QQ 交流一下嘛 ?51264722 我Q ...
web应用程序和Web网站区别 -
iaimg:
我想问下嵌入delphi写的程序总是出现窗体后面感觉有个主窗体 ...
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部 -
iaimg:
代码地址下不了啊!
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
一、把选中的多个表生成实体
我们会生成一个表的实体类了,那么一次生成多个表的实体类就可以在此基础上实现了��?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>
发表评论
-
精选30个优秀的CSS技术和实例
2010-04-24 09:28 1136在网上闲逛的时候,发现了一篇关于介绍css的文章,虽然是 ... -
jQuery常用技巧大放送
2010-04-02 13:10 8141、关于页面元素的引用 ... -
12种Javascript解决常见浏览器兼容问题的方法
2010-01-08 12:56 1033们提倡尽可能使用CSS, ... -
优化Meta讨好搜索引擎 更好的提升网站排名
2010-01-09 08:53 1070网页代码中的Meta标 ... -
cnblog div+CSS 布局常识 8问
2010-01-25 14:28 882CSSer与其他IT职位一样,在找工作的时候,都会面临着面试官 ... -
页面跳转代码整理
2010-03-07 20:58 912通过JS跳转 <script type=" ... -
页面跳转代码整理
2010-03-07 20:58 866通过JS跳转 <script type=" ... -
cnblog div+CSS 布局常识 8问
2010-01-25 14:28 914CSSer与其他IT职位一样,在找工作的时候,都会面临着面试官 ... -
优化Meta讨好搜索引擎 更好的提升网站排名
2010-01-09 08:53 1036网页代码中的Meta标 ...
相关推荐
《使用Codesmith生成C#实体类的简易模板详解》 在软件开发过程中,尤其是在与数据库交互的业务逻辑层,实体类的创建是一项繁琐且重复的工作。 Codesmith是一款强大的代码生成工具,它允许开发者通过定制模板来自动...
例如,Script.cst可能是用于生成单一表的脚本,而ScriptsTest.cst可能是一个用于测试或包含多个表生成逻辑的模板。在这些模板中,我们可以定义如何获取表的信息(如列名、数据类型、主键等),并构建对应的SQL语句。...
里面是CodeSmith根据数据库表生成实体类的例子, 数据库是mysql,生成的是java文件, codesmith的mysql链接字符串为: Database=test;Data Source=127.0.0.1;User Id=root;Password=root;port=3306
总结起来,当CodeSmith 8.0生成的MySQL实体缺少字段和表注释时,我们可以采取以下措施: - 找到并替换`SchemaProviders`目录中的相关文件。 - 检查和确认CodeSmith的数据库驱动选择。 - 参考`使用说明.txt`文件以...
对于Nhibernate,用户可以创建模板来生成映射文件,模板可以根据数据库表结构自动生成对应的实体类,同时包括NHibernate的Session工厂、Session接口和实现,以及Repository模式的相关类。这样,开发者只需要关注业务...
标题提到的问题“解决CodeSmith生成mysql实体没有字段注释和表注释”正是针对这一需求。 首先,让我们深入理解这个问题。CodeSmith默认可能不包含对MySQL字段和表注释的支持,或者注释部分未在生成的代码中体现。要...
CodeSmith自动生成实体类,数据访问层/.................
里面是CodeSmith根据数据表生成实体类的例子 用的是mysql数据库 链接字符串为: Database=test;Data Source=127.0.0.1;User Id=root;Password=root;port=3306
帮你自动生成无聊而又必须的数据表的实体类,默认是C#,.net。
使用codesmith生成实体类,开发者无需手动创建每个字段及其属性,只需通过模板定义,codesmith会自动生成包含字段名、数据类型、属性注解等信息的类。这样不仅保证了代码的规范性,也减少了出错的可能性。 2. **...
### 使用CodeSmith生成数据库实体类的代码(C#) 在软件开发过程中,特别是在涉及数据库操作时,我们经常会遇到需要创建数据库实体类的情况。这些实体类通常用于封装数据表中的记录,并提供对这些记录的操作方法。...
在本主题中,我们将深入探讨CodeSmith如何自动生成实体类的模板代码,并了解这一过程中的关键知识点。 实体类(Entity Class)是面向对象编程中的一个重要概念,它通常用于数据模型的表示,对应数据库中的表或视图...
CodeSmith是一款强大的代码生成工具,尤其在数据库实体类的生成方面表现出色。...通过观看这个"使用CodeSmith编码生成实体类经典视频",你可以系统地学习并掌握这个工具,让开发工作变得更加轻松。
在描述中提到的问题是关于CodeSmith 8.0版本在生成MySQL数据库实体时,无法正确地包含字段注释和表注释,这对于代码的可读性和维护性是至关重要的。下面将详细介绍如何解决这个问题。 首先,我们需要理解CodeSmith...
CodeSmith 是一种基于模板的代码生成工具,它使用类似于 ASP.NET 的语法来生成任意类型的代码或文本。与其他许多代码生成工具不同,CodeSmith 不要求您订阅特定的应用程序设计或体系结构。使用 CodeSmith,可以生成...
通过查看这些文件,可以了解CodeSmith是如何根据数据库表结构自动生成实体类的。 ##### 4.2 查看生成的映射文件 同样地,打开“Maps”文件夹,可以看到每个实体类都有一个对应的映射文件。这些映射文件定义了实体...
总结来说,CodeSmith .NET 2.0三层自动生成模板是一个强大的开发辅助工具,它可以帮助开发者快速构建符合三层架构的项目,提高开发效率,并保持代码的结构清晰和易于维护。通过熟练掌握和利用CodeSmith,开发者可以...
根据提供的文件信息,我们可以深入探讨如何使用CodeSmith工具来生成针对特定数据库表的实体类代码。此过程将涉及对CodeSmith模板语法的理解、所需库的引入以及如何为不同编程语言(如VB.NET与C#)生成实体类的具体...
Codesmith的NHibernate模板则能够生成实体类、映射文件以及数据访问层代码,极大地提升了开发速度。 在提供的"nhibernate_template.zip"文件中,我们可以找到预设的NHibernate模板,包括但不限于实体类模板、映射...
在这个特定的场景中,我们关注的是如何使用CodeSmith来生成XML的C#实体类。 XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,广泛应用于数据交换、配置文件和文档存储等。C#实体类则是将XML...