实在没有时间格式化转载的文章内容 内容贴过来 是大概显示 文章写的什么内容 下面是转载地址  内容有格式化

http://hi.baidu.com/grayworm/blog/item/311681131e344426dc540169.html

CodeSmith实体类 在开发过程中对实体类的编写是不可避免的事情,这是一项苦燥的事情并且还容易出现手误的问题。 利用CodeSmith的SchemaExplorer类我们可以动态取出数据库中的表名字段名,然后生成出实体类。 一、单表实体类的模板编写 思路: 1、定义一个TableSchema的属性。 2、根据选中的表,编历其中的每一列,根据列名和列的类型生成成员变量和访问属性。 这里麻烦的一点是根据表中列的类型来控制生成代码的类型。 <%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" Description="Template description here." %> <%--定义一个属性用来选择生成的表--%> <%@ Property Name="TargetTable" Type="SchemaExplorer.TableSchema" Default="" Optional="False" Category="" Description="" OnChanged="" Editor="" EditorBase="" Serializer="" %> <%@ Assembly Name="System.Data" %> <%@ Assembly Name="SchemaExplorer" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="SchemaExplorer" %> using System; <%--根据表名设置类名,类名首字母大写,并且以Data结尾,如CarData--%> class <%=TargetTable.Name.Substring(0,1).ToUpper()%><%=TargetTable.Name.Substring(1,TargetTable.Name.Length-1)%>Data { <% for(int i=0;i<TargetTable.Columns.Count;i++){%> <%--CreateMember()函数的作用是为根据数据库中字段的类型来生成成员变量和属性的类型,成员变量名以下划线开头--%> private <%=createMember(TargetTable.Columns[i])%> _<%=TargetTable.Columns[i].Name.Trim()%>; <%}%> <%for(int i=0;i<TargetTable.Columns.Count;i++){%> <%--属性名首字母大写--%> public <%=createMember(TargetTable.Columns[i])%> <%=TargetTable.Columns[i].Name.Trim().Substring(0,1).ToUpper()%><%=TargetTable.Columns[i].Name.Trim().Substring(1,TargetTable.Columns[i].Name.Trim().Length-1)%> {    get    {     return _<%=TargetTable.Columns[i].Name.Trim()%>;    }    set    {     _<%=TargetTable.Columns[i].Name.Trim()%> = value;    } } <%}%> } <script runat="template"> private string createMember(ColumnSchema cs)// { switch(cs.DataType) {    case DbType.AnsiString:    case DbType.String:    case DbType.StringFixedLength:     return "string";    case DbType.Int32:    case DbType.Int16:    case DbType.Int64:    case DbType.UInt16:    case DbType.UInt32:    case DbType.UInt64:     return "int";    case DbType.Boolean:     return "bool";    case DbType.DateTime:    case DbType.Date:    case DbType.DateTime2:    case DbType.Time:     return "DateTime";    case DbType.Decimal:     return "decimal";    case DbType.Double:    case DbType.Currency:     return "float";    case DbType.Binary:     return "byte[]";    default :     return "object";   } } </script> 运行结果:

二、外键表实体类的编写 数据库中表结构如下:

作为Score表中的cno和sno是对应Course表和Student表的外键。在对应的实体类中表示cno和sno这两个字段,我们一般以自定义类型的作为成员变量。即 class Student { //... } class Course { //... } class Score { private Student _student; private Course _course; private decimal _degree; //... } 在CodeSmith模板的编写过程中我们应当在“单表实体类的模板编写”的基础上考虑这种有外键关系的情况来生成相应的源代码。 思路: 1、定义一个属性TableSchema 2、根据选中的表,检索出其中的外键对象 3、根据选中的表编历每一列,并判断该列是否是外键列,如果不是外键列,就根据字段类型生成简单的成员变量;如果是外键列,再根据外键对象找到对应的主键表,并根据主键表的表名生成自定义的成员变量。

知识点: TableSchema类:描述数据库中的表 TableKeySchema类:描述数据库中表的主键或外键 TableKeySchemaCollection类:描述数据库中表的所有键的集合 ColumnSchema类:描述数据库中表的列 ColumnSchemaCollection类:描述数据库表的列的集合

//FTable是TableSchema类型的属性 FTable.ForeignKeys:(TableKeySchemaCollection)获取FTable表的所有的外键 FTable.PrimaryKey:(PrimaryKeySchema)获取FTable表的主键

//tks是TableKeySchema类型的变量 tks.PrimaryKeyTable:键对象所对应的主键表 tks.PrimaryKeyMemberColumns:键对象所对应的主键表中的主键列的集合 tks.PrimaryKey:键对象所对应的主键 tks.ForeignKeyTable:键对象所对应的外键表 tks.ForeignKeyMemberColumns键对象所对应的外键表中的外键的列的集合

如: <%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" Description="Template description here." %> <%@ Property Name="FTable" Type="SchemaExplorer.TableSchema" Default="" Optional="False" Category="" Description="" OnChanged="" Editor="" EditorBase="" Serializer="" %> <%@ Assembly Name="SchemaExplorer" %> <%@ Assembly Name="System.Data" %> <%@ Import Namespace="SchemaExplorer" %> <%@ Import Namespace="System.Data" %> <% //遍历表中的每一个外键对象 foreach(TableKeySchema tks in FTable.ForeignKeys) { //打印外键的名称 Response.Write("***ForeignKeyName:"+tks.Name+"***"); //遍历该外键的每一个列 foreach(ColumnSchema cs in tks.ForeignKeyMemberColumns) {    Response.Indent();//缩进    Response.Write("ForeignKeyColumnName:"+cs.Name.ToString());//显示外键列的名称    Response.WriteLine();//换行    Response.Unindent();//反缩进 } //遍历该外键对应主键表的每个主键的列 foreach(ColumnSchema cs in tks.PrimaryKeyMemberColumns) {    Response.Indent();    //打印主键的表名和主键列名    Response.Write("ForeignKey's PrimaryTableName:"+cs.Table.Name.ToString()+" ForeignKey's PrimaryKeyName:"+cs.Name.ToString());    Response.WriteLine();    Response.Unindent(); } //打印该外键对应的外键表对象 Response.Write("ForeignKey's TableName:"+tks.ForeignKeyTable.ToString());  Response.WriteLine(); //打印该外键对应的主键表对象 Response.Write("ForeignKeys's PrimaryTableName:"+tks.PrimaryKeyTable); Response.WriteLine(); //打印该外键对应的主表中的主键名 Response.Write("ForeignKeys's PrimaryKeyName:"+tks.PrimaryKey.Name); Response.WriteLine(); } %> 运行效果:

编写外键实体类的代码: <%@ 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="System.Data" %> <%@ Assembly Name="SchemaExplorer" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="SchemaExplorer" %> using System; <% //取出表名(首字母大写) string classname = TTable.Name.ToUpper().Substring(0,1)+TTable.Name.Substring(1,TTable.Name.Length-1); //自定义类型的成员变量类型的名称,以“表名+Data”为类名 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.Substring(1,tks.PrimaryKeyTable.Name.Length-1);        //把找到的“表名+Data”作为自定义成员变量的类型         entitytype = entityname+"Data";         break;        }       }      }     %>    <%--根据上面生成的实体类型名称,定义成员变量以“_”加表名小写为成员变量名--%>    private <%=entitytype%> _<%=entityname.ToLower()%>;     <%}%>    <%--如果不是外键列直接输出成员变量的Property(首字母大写)--%>     <%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{%>    <%--如果是外键列,就用上面生成的实体类型名称entitytype来定义属性(首字母大写)--%>     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 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> 运行效果:

posted on 2012-01-12 13:57  ﹎蓝言觅ぷ雨  阅读(1300)  评论(0)    收藏  举报