CodeSmith是一款与数据库相关的工具,只要与数据库相关的类都可以通过它编写模板来批量实现。
<%@ Template Language="C#" TargetLanguage="C#" %> <%@ Assembly Name="SchemaExplorer"%> <%@ Import Namespace="SchemaExplorer"%> <%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema"%> using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Model { public class <%=GetClassName()%> { <%foreach(ColumnSchema column in this.SourceTable.Columns)%><%{%> <%=GetCSDataType(column)%> <%=ToCamel(column.Name)%>; public <%=GetCSDataType(column)%> <%=ToPascal(column.Name)%> { get { return <%=ToCamel(column.Name)%>; } set { <%=ToCamel(column.Name)%> = value; } } <%}%> } } <script runat="template"> //Pascal命名法(将首字母大写) public string ToPascal(string s) { return s.Substring(0,1).ToUpper()+s.Substring(1); } //骆驼命名法(将首字母小写) public string ToCamel(string s) { return s.Substring(0,1).ToLower()+s.Substring(1); } //得到类的名字(由表名而来) public string GetClassName() { string s=this.SourceTable.Name;//取到表名 //判断表名是不是以S结尾,如果是去掉S if (s.EndsWith("s")) { return ToPascal(s.Substring(0,s.Length-1)); } return ToPascal(s); } //得到C#的数据类型(将基本常用的数据类型意逐个转换) public static string GetCSDataType(ColumnSchema column) { if (column.Name.EndsWith("TypeCode")) return column.Name; switch (column.DataType) { case DbType.AnsiString: return "string"; case DbType.AnsiStringFixedLength: return "string"; case DbType.Binary: return "byte[]"; case DbType.Boolean: return "bool"; case DbType.Byte: return "byte"; case DbType.Currency: return "decimal"; case DbType.Date: return "DateTime"; case DbType.DateTime: return "DateTime"; case DbType.Decimal: return "decimal"; case DbType.Double: return "double"; case DbType.Guid: return "Guid"; case DbType.Int16: return "short"; case DbType.Int32: return "int"; case DbType.Int64: return "long"; case DbType.Object: return "object"; case DbType.SByte: return "sbyte"; case DbType.Single: return "float"; case DbType.String: return "string"; case DbType.StringFixedLength: return "string"; case DbType.Time: return "TimeSpan"; case DbType.UInt16: return "ushort"; case DbType.UInt32: return "uint"; case DbType.UInt64: return "ulong"; case DbType.VarNumeric: return "decimal"; default: { return "__UNKNOWN__" + column.NativeType; } } } public override string GetFileName() { return this.GetClassName()+".cs"; } </script>
这是一个为指定的某一张表生成实体类的模板。
在编译运行之后就有以下结果:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Model { public class StudentExamQuestionAnswer { int id; public int Id { get { return id; } set { id = value; } } int examId; public int ExamId { get { return examId; } set { examId = value; } } int studentId; public int StudentId { get { return studentId; } set { studentId = value; } } int questionId; public int QuestionId { get { return questionId; } set { questionId = value; } } string answer; public string Answer { get { return answer; } set { answer = value; } } int examQuestionId; public int ExamQuestionId { get { return examQuestionId; } set { examQuestionId = value; } } int examStudentId; public int ExamStudentId { get { return examStudentId; } set { examStudentId = value; } } } }
跟我们平时一句一句的写代码是一模一样。怎么样?批量生成不错吧!还有更美的呢!