需要先安装codeSmith6.5
<%--
Name: NHibernate template
Author: Henry
Description: autogen .cs files
--%>
<%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" Description="Template description here." %>
<%@ Property Name="SampleStringProperty" Type="System.String" Default="SomeValue" Optional="True" Category="Strings" Description="This is a sample string property."%>
<%@ Property Name="SampleBooleanProperty" Type="System.Boolean" Default="True" Optional="False" Category="Booleans" Description="This is a sample boolean property."%>
<%@ Assembly Name="System.Data" %>
<%@ Import Namespace="System.Data" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%--模板属性--%>
<%@ Property Name="DataBase" Type="SchemaExplorer.DatabaseSchema" Category="Context" Description="数据库连接." %>
<%@ Property Name="TableName" Type="System.String" Default="" Optional="False" Category="" Description="表名" %>
<%@ Property Name="NameSpace" Type="System.String" Default="Company.Product.Module" Optional="False" Category="" Description="命名空间" %>
<%@ Property Name="Author" Type="System.String" Default="Author" Optional="False" Category="" Description="作者" %>
<%@ Property Name="Description" Type="System.String" Default="实体类" Optional="False" Category="" Description="该类的描述" %>
<script runat="template">
CodeTemplateRule rule=new CodeTemplateRule();
public class CodeTemplateRule
{
/**//// <summary>
/// 获取所有列的集合
/// </summary>
/// <param name="dataBase">数据库Schema</param>
/// <param name="tableName">表名</param>
/// <returns>Columns Schema</returns>
public ColumnSchemaCollection GetColumnCollection(DatabaseSchema dataBase,string tableName)
{
TableSchemaCollection tables = new TableSchemaCollection(dataBase.Tables);
ColumnSchemaCollection columns=null;
for(int i=0;i<tables.Count;i++)
{
if(tables[i].Name.ToUpper()==tableName.ToUpper())
{
TableSchema ts=tables[i];
columns=new ColumnSchemaCollection(ts.Columns);
}
}
return columns;
}
/**//// <summary>
/// 获取处理后的表名 例如:ORG_Person,返回Person
/// </summary>
/// <param name="tableName">表名</param>
/// <returns>返回处理后的表名</returns>
public string GetTableName(string tableName)
{
int i=tableName.IndexOf("_");
return tableName.Substring(i+1,tableName.Length-(i+1));
}
/**//// <summary>
/// 获取唯一号的变量名,第一个字母小写
/// </summary>
/// <param name="guidColumn">唯一号列名</param>
/// <returns>唯一号的变量名</returns>
public string GetGuidColumnVar(string guidColumn)
{
string guid;
guid=guidColumn.Substring(0,1).ToLower()+guidColumn.Substring(1,guidColumn.Length-1);
return guid;
}
/**//// <summary>
/// 获取c#变量类型
/// </summary>
/// <param name="column">列</param>
/// <returns>c#变量类型</returns>
public string GetType(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 "int";
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;
}
}
}
/**//// <summary>
/// 获取c#变量类型默认值
/// </summary>
/// <param name="column">列</param>
/// <returns>c#变量类型默认值</returns>
public string GetDefaultValue(ColumnSchema column)
{
if (column.Name.EndsWith("TypeCode")) return column.Name;
switch (column.DataType)
{
case DbType.AnsiString: return "\"\"";
case DbType.AnsiStringFixedLength: return "\"\"";
case DbType.Binary: return "null";
case DbType.Boolean: return "false";
case DbType.Byte: return "0";
case DbType.Currency: return "0";
case DbType.Date: return "DateTime.Parse(\"1900-1-1\")";
case DbType.DateTime: return "DateTime.Parse(\"1900-1-1\")";
case DbType.Decimal: return "0";
case DbType.Double: return "0";
case DbType.Guid: return "Guid.NewGuid().ToString()";
case DbType.Int16: return "0";
case DbType.Int32: return "0";
case DbType.Int64: return "0";
case DbType.Object: return "\"\"";
case DbType.SByte: return "0";
case DbType.Single: return "0";
case DbType.String: return "\"\"";
case DbType.StringFixedLength: return "";
case DbType.Time: return "DateTime.Parse(\"1900-1-1\")";
case DbType.UInt16: return "0";
case DbType.UInt32: return "0";
case DbType.UInt64: return "0";
case DbType.VarNumeric: return "0";
default:
{
return "__UNKNOWN__" + column.NativeType;
}
}
}
/**//// <summary>
/// 获取c#变量类型默认值
/// </summary>
/// <param name="column">列</param>
/// <returns>c#变量类型默认值</returns>
public string GetConvert(ColumnSchema column)
{
if (column.Name.EndsWith("TypeCode")) return column.Name;
switch (column.DataType)
{
case DbType.AnsiString: return "Convert.ToString";
case DbType.AnsiStringFixedLength: return "Convert.ToString";
case DbType.Binary: return "Convert.ToByte";
case DbType.Boolean: return "Convert.ToBoolean";
case DbType.Byte: return "Convert.ToInt32";
case DbType.Currency: return "Convert.ToDecimal";
case DbType.Date: return "Convert.DateTime";
case DbType.DateTime: return "Convert.DateTime";
case DbType.Decimal: return "Convert.ToDecimal";
case DbType.Double: return "Convert.ToDouble";
case DbType.Guid: return "Convert.ToString";
case DbType.Int16: return "Convert.ToInt16";
case DbType.Int32: return "Convert.ToInt32";
case DbType.Int64: return "Convert.ToInt64";
case DbType.Object: return "Convert.ToString";
case DbType.SByte: return "Convert.ToByte";
case DbType.Single: return "Convert.ToInt32";
case DbType.String: return "Convert.ToString";
case DbType.StringFixedLength: return "Convert.ToString";
case DbType.Time: return "Convert.DateTime";
case DbType.UInt16: return "Convert.ToUInt16";
case DbType.UInt32: return "Convert.ToUInt32";
case DbType.UInt64: return "Convert.ToUInt64";
case DbType.VarNumeric: return "Convert.ToDecimal";
default:
{
return "__UNKNOWN__" + column.NativeType;
}
}
}
public string ConvPropertyName(string name)
{
return name.Substring(0,1).ToUpper() +
name.Substring(1);
}
}
</script>
using System;
namespace <%= NameSpace %>
{
/// <summary>
/// 作用:<%= Description %>
/// 作者:<%= Author %>
/// 日期:<%= DateTime.Now.ToString() %>
///</summary>
public class <%= rule.ConvPropertyName(rule.GetTableName(TableName)) %>Entity
{
/// <summary>
/// 构造函数
///</summary>
public <%= rule.ConvPropertyName(rule.GetTableName(TableName)) %>Entity()
{
}
<%
//局部变量
ColumnSchemaCollection columns=rule.GetColumnCollection(DataBase,TableName);
for(int i=0;i<columns.Count;i++)
{
Response.Write(" //"+columns[i].Description+"\r\n");
Response.Write(" private "+rule.GetType(columns[i])+" m_"+columns[i].Name+";\r\n");
}
%>
#region properties
<%
//属性
for(int i=0;i<columns.Count;i++)
{
%>
///<summary>
///<%= columns[i].Description %>
///</summary>
public <%= rule.GetType(columns[i]) %> <%= rule.ConvPropertyName(columns[i].Name) %>
{
get { return m_<%= columns[i].Name %>; }
set { m_<%= columns[i].Name %>=value; }
}
<%
}
%>
#endregion
}
}
生成 .hbm.xml 文件
<%--
Name: NHibernate template generator
Author: Henry
Description: autogen .hbm.xml files
--%>
<%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" Description="Template description here." %>
<%@ Assembly Name="System.Data" %>
<%@ Import Namespace="System.Data" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%--模板属性--%>
<%@ Property Name="DataBase" Type="SchemaExplorer.DatabaseSchema" Category="Context" Description="数据库连接." %>
<%@ Property Name="TableName" Type="System.String" Default="" Optional="False" Category="" Description="表名" %>
<%@ Property Name="NameSpace" Type="System.String" Default="Company.Product.Module" Optional="False" Category="" Description="命名空间" %>
<%@ Property Name="Author" Type="System.String" Default="Author" Optional="False" Category="" Description="作者" %>
<%@ Property Name="Description" Type="System.String" Default="实体类" Optional="False" Category="" Description="该类的描述" %>
<%@ Property Name="Assembly" Type="System.String" Default="3GWap.Core" Optional="False" Category="" Description="库名" %>
<script runat="template">
CodeTemplateRule rule=new CodeTemplateRule();
public class CodeTemplateRule
{
/**//// <summary>
/// 获取所有列的集合
/// </summary>
/// <param name="dataBase">数据库Schema</param>
/// <param name="tableName">表名</param>
/// <returns>Columns Schema</returns>
public ColumnSchemaCollection GetColumnCollection(DatabaseSchema dataBase,string tableName)
{
TableSchemaCollection tables = new TableSchemaCollection(dataBase.Tables);
ColumnSchemaCollection columns=null;
for(int i=0;i<tables.Count;i++)
{
if(tables[i].Name.ToUpper()==tableName.ToUpper())
{
TableSchema ts=tables[i];
columns=new ColumnSchemaCollection(ts.Columns);
}
}
return columns;
}
/**//// <summary>
/// 获取处理后的表名 例如:ORG_Person,返回Person
/// </summary>
/// <param name="tableName">表名</param>
/// <returns>返回处理后的表名</returns>
public string GetTableName(string tableName)
{
int i=tableName.IndexOf("_");
return tableName.Substring(i+1,tableName.Length-(i+1));
}
/**//// <summary>
/// 获取唯一号的变量名,第一个字母小写
/// </summary>
/// <param name="guidColumn">唯一号列名</param>
/// <returns>唯一号的变量名</returns>
public string GetGuidColumnVar(string guidColumn)
{
string guid;
guid=guidColumn.Substring(0,1).ToLower()+guidColumn.Substring(1,guidColumn.Length-1);
return guid;
}
/**//// <summary>
/// 获取c#变量类型
/// </summary>
/// <param name="column">列</param>
/// <returns>c#变量类型</returns>
public string GetType(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 "int";
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;
}
}
}
/**//// <summary>
/// 获取c#变量类型默认值
/// </summary>
/// <param name="column">列</param>
/// <returns>c#变量类型默认值</returns>
public string GetDefaultValue(ColumnSchema column)
{
if (column.Name.EndsWith("TypeCode")) return column.Name;
switch (column.DataType)
{
case DbType.AnsiString: return "\"\"";
case DbType.AnsiStringFixedLength: return "\"\"";
case DbType.Binary: return "null";
case DbType.Boolean: return "false";
case DbType.Byte: return "0";
case DbType.Currency: return "0";
case DbType.Date: return "DateTime.Parse(\"1900-1-1\")";
case DbType.DateTime: return "DateTime.Parse(\"1900-1-1\")";
case DbType.Decimal: return "0";
case DbType.Double: return "0";
case DbType.Guid: return "Guid.NewGuid().ToString()";
case DbType.Int16: return "0";
case DbType.Int32: return "0";
case DbType.Int64: return "0";
case DbType.Object: return "\"\"";
case DbType.SByte: return "0";
case DbType.Single: return "0";
case DbType.String: return "\"\"";
case DbType.StringFixedLength: return "";
case DbType.Time: return "DateTime.Parse(\"1900-1-1\")";
case DbType.UInt16: return "0";
case DbType.UInt32: return "0";
case DbType.UInt64: return "0";
case DbType.VarNumeric: return "0";
default:
{
return "__UNKNOWN__" + column.NativeType;
}
}
}
/**//// <summary>
/// 获取c#变量类型默认值
/// </summary>
/// <param name="column">列</param>
/// <returns>c#变量类型默认值</returns>
public string GetConvert(ColumnSchema column)
{
if (column.Name.EndsWith("TypeCode")) return column.Name;
switch (column.DataType)
{
case DbType.AnsiString: return "Convert.ToString";
case DbType.AnsiStringFixedLength: return "Convert.ToString";
case DbType.Binary: return "Convert.ToByte";
case DbType.Boolean: return "Convert.ToBoolean";
case DbType.Byte: return "Convert.ToInt32";
case DbType.Currency: return "Convert.ToDecimal";
case DbType.Date: return "Convert.DateTime";
case DbType.DateTime: return "Convert.DateTime";
case DbType.Decimal: return "Convert.ToDecimal";
case DbType.Double: return "Convert.ToDouble";
case DbType.Guid: return "Convert.ToString";
case DbType.Int16: return "Convert.ToInt16";
case DbType.Int32: return "Convert.ToInt32";
case DbType.Int64: return "Convert.ToInt64";
case DbType.Object: return "Convert.ToString";
case DbType.SByte: return "Convert.ToByte";
case DbType.Single: return "Convert.ToInt32";
case DbType.String: return "Convert.ToString";
case DbType.StringFixedLength: return "Convert.ToString";
case DbType.Time: return "Convert.DateTime";
case DbType.UInt16: return "Convert.ToUInt16";
case DbType.UInt32: return "Convert.ToUInt32";
case DbType.UInt64: return "Convert.ToUInt64";
case DbType.VarNumeric: return "Convert.ToDecimal";
default:
{
return "__UNKNOWN__" + column.NativeType;
}
}
}
public string ConvPropertyName(string name)
{
return name.Substring(0,1).ToUpper() +
name.Substring(1);
}
public string GetHbmType(ColumnSchema column)
{
if (column.Name.EndsWith("TypeCode")) return column.Name;
switch (column.DataType)
{
case DbType.AnsiString: return "String";
default: return column.DataType.ToString();
}
}
}
</script>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="<%= NameSpace %>.<%= rule.ConvPropertyName(rule.GetTableName(TableName)) %>, <%= Assembly %>" table="<%= TableName %>">
<%
//局部变量
ColumnSchemaCollection columns=rule.GetColumnCollection(DataBase,TableName);
for(int i=0;i<columns.Count;i++)
{
Response.Write(" ");
Response.Write("<property name=\"" + rule.ConvPropertyName(columns[i].Name) + "\"");
Response.Write(" type=\"" + rule.GetHbmType(columns[i]) + "\"");
if (columns[i].Size != 0)
Response.Write(" length=\"" + columns[i].Size + "\"");
Response.Write(" column=\"" + columns[i].Name + "\"");
Response.Write("/>\r\n");
}
%>
</class>
</hibernate-mapping>