`
pcajax
  • 浏览: 2158838 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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生成实体类简单模板

    《使用Codesmith生成C#实体类的简易模板详解》 在软件开发过程中,尤其是在与数据库交互的业务逻辑层,实体类的创建是一项繁琐且重复的工作。 Codesmith是一款强大的代码生成工具,它允许开发者通过定制模板来自动...

    CodeSmith的批量生成数据库表创建脚本的模板

    例如,Script.cst可能是用于生成单一表的脚本,而ScriptsTest.cst可能是一个用于测试或包含多个表生成逻辑的模板。在这些模板中,我们可以定义如何获取表的信息(如列名、数据类型、主键等),并构建对应的SQL语句。...

    CodeSmith根据数据库表生成实体类的例子

    里面是CodeSmith根据数据库表生成实体类的例子, 数据库是mysql,生成的是java文件, codesmith的mysql链接字符串为: Database=test;Data Source=127.0.0.1;User Id=root;Password=root;port=3306

    解决CodeSmith 8.0生成mysql实体没有字段注释和表注释,亲测好用

    总结起来,当CodeSmith 8.0生成的MySQL实体缺少字段和表注释时,我们可以采取以下措施: - 找到并替换`SchemaProviders`目录中的相关文件。 - 检查和确认CodeSmith的数据库驱动选择。 - 参考`使用说明.txt`文件以...

    CodeSmith 生成工具 6.5 (可生成Nhibernate)

    对于Nhibernate,用户可以创建模板来生成映射文件,模板可以根据数据库表结构自动生成对应的实体类,同时包括NHibernate的Session工厂、Session接口和实现,以及Repository模式的相关类。这样,开发者只需要关注业务...

    解决CodeSmith生成mysql实体没有字段注释和表注释

    标题提到的问题“解决CodeSmith生成mysql实体没有字段注释和表注释”正是针对这一需求。 首先,让我们深入理解这个问题。CodeSmith默认可能不包含对MySQL字段和表注释的支持,或者注释部分未在生成的代码中体现。要...

    自动生成实体类CodeSmith

    CodeSmith自动生成实体类,数据访问层/.................

    CodeSmith根据数据库表生成实体类

    里面是CodeSmith根据数据表生成实体类的例子 用的是mysql数据库 链接字符串为: Database=test;Data Source=127.0.0.1;User Id=root;Password=root;port=3306

    自用的CodeSmith生成实体类模板

    帮你自动生成无聊而又必须的数据表的实体类,默认是C#,.net。

    codesmith生成实体类、数据层类、和存储过程

    使用codesmith生成实体类,开发者无需手动创建每个字段及其属性,只需通过模板定义,codesmith会自动生成包含字段名、数据类型、属性注解等信息的类。这样不仅保证了代码的规范性,也减少了出错的可能性。 2. **...

    用CodeSmith生成数据库实体类的代码C#

    ### 使用CodeSmith生成数据库实体类的代码(C#) 在软件开发过程中,特别是在涉及数据库操作时,我们经常会遇到需要创建数据库实体类的情况。这些实体类通常用于封装数据表中的记录,并提供对这些记录的操作方法。...

    CodeSmith自动生成实体类的模板代码

    在本主题中,我们将深入探讨CodeSmith如何自动生成实体类的模板代码,并了解这一过程中的关键知识点。 实体类(Entity Class)是面向对象编程中的一个重要概念,它通常用于数据模型的表示,对应数据库中的表或视图...

    CodeSmith 编码生成实体类

    CodeSmith是一款强大的代码生成工具,尤其在数据库实体类的生成方面表现出色。...通过观看这个"使用CodeSmith编码生成实体类经典视频",你可以系统地学习并掌握这个工具,让开发工作变得更加轻松。

    解决CodeSmith 8.0生成mysql实体没有字段注释和表注释

    在描述中提到的问题是关于CodeSmith 8.0版本在生成MySQL数据库实体时,无法正确地包含字段注释和表注释,这对于代码的可读性和维护性是至关重要的。下面将详细介绍如何解决这个问题。 首先,我们需要理解CodeSmith...

    Java 代码生成器CodeSmith是一个好工具

    CodeSmith 是一种基于模板的代码生成工具,它使用类似于 ASP.NET 的语法来生成任意类型的代码或文本。与其他许多代码生成工具不同,CodeSmith 不要求您订阅特定的应用程序设计或体系结构。使用 CodeSmith,可以生成...

    用CodeSmith生成nhibernate的映射文件说明

    通过查看这些文件,可以了解CodeSmith是如何根据数据库表结构自动生成实体类的。 ##### 4.2 查看生成的映射文件 同样地,打开“Maps”文件夹,可以看到每个实体类都有一个对应的映射文件。这些映射文件定义了实体...

    CodeSmith .net 三层自动生成模板

    总结来说,CodeSmith .NET 2.0三层自动生成模板是一个强大的开发辅助工具,它可以帮助开发者快速构建符合三层架构的项目,提高开发效率,并保持代码的结构清晰和易于维护。通过熟练掌握和利用CodeSmith,开发者可以...

    用CodeSmith生成数据库实体类的代码 VB

    根据提供的文件信息,我们可以深入探讨如何使用CodeSmith工具来生成针对特定数据库表的实体类代码。此过程将涉及对CodeSmith模板语法的理解、所需库的引入以及如何为不同编程语言(如VB.NET与C#)生成实体类的具体...

    codesmith常用.NET框架生成模版

    Codesmith的NHibernate模板则能够生成实体类、映射文件以及数据访问层代码,极大地提升了开发速度。 在提供的"nhibernate_template.zip"文件中,我们可以找到预设的NHibernate模板,包括但不限于实体类模板、映射...

    CodeSmith生成XML的实体类(C#)

    在这个特定的场景中,我们关注的是如何使用CodeSmith来生成XML的C#实体类。 XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,广泛应用于数据交换、配置文件和文档存储等。C#实体类则是将XML...

Global site tag (gtag.js) - Google Analytics