codesmith生成实体类模板
lawbc 2009-05-01 06:03:29 <%--
Date:2009-04-30
Author:liubiaocai
Description: 根据数据库表生成实体类(私有字段首字母小写,公共属性首字母大写)
--%>
<%@ CodeTemplate Language="C#"
TargetLanguage="C#"
ResponseEncoding="UTF-8"
Description="根据数据库表生成实体类" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Property Name="SourceTable"
Type="SchemaExplorer.TableSchema"
Category="Context"
Description="要生成实体类的数据库" %>
<script runat="template">
/// <summary>
/// 数据库类型转换成C#类型
/// </summary>
/// <param name="value">ColumnSchema类型</param>
/// <returns></returns>
public string ConvertSqlType(ColumnSchema column)
{
string type = string.Empty;
switch(column.DataType)
{
case System.Data.DbType.Single:
type=column.AllowDBNull?"float?":"float";
break;
case System.Data.DbType.Xml:
type="string";
break;
case System.Data.DbType.Boolean:
type=column.AllowDBNull?"bool?":"bool";
break;
case System.Data.DbType.Guid:
type="Guid";
break;
case System.Data.DbType.Object:
type="object";
break;
default:
type=column.AllowDBNull?column.SystemType.ToString() + "?":column.SystemType.ToString();
break;
}
type = type.Replace("System.","");
if(type.IndexOf("Byte[]")>=0 || type.IndexOf("String")>=0)
{
type = type.Replace("?","");
}
if(type.IndexOf("DateTime")==-1 && type.IndexOf("Int")==-1 && type.IndexOf("Guid")==-1)
{
type = type.ToLower();
}
return type;
}
/// <summary>
/// 首字母大写
/// </summary>
/// <param name="value">输入字符串</param>
/// <returns></returns>
public string FirstToUpper(string value)
{
string upper = string.Empty;
if (string.IsNullOrEmpty(value) || value.Trim().Length == 0)
{
return value;
}
upper = value.Substring(0, 1).ToUpper();
if (value.Length < 2)
{
return upper;
}
return upper + value.Substring(1, value.Length-1);
}
/// <summary>
/// 首字母小写
/// </summary>
/// <param name="value">输入字符串</param>
/// <returns></returns>
public string FirstToLower(string value)
{
string lower = string.Empty;
if (string.IsNullOrEmpty(value) || value.Trim().Length == 0)
{
return value;
}
lower = value.Substring(0, 1).ToLower();
if (value.Length < 2)
{
return lower;
}
return lower + value.Substring(1, value.Length-1);
}
/// <summary>
/// 获取默认值
/// </summary>
/// <param name="column">ColumnSchema类型</param>
/// <returns></returns>
public string GetDefault(ColumnSchema column)
{
string value = column.ExtendedProperties["CS_Default"].Value.ToString().Replace("(","").Replace(")","");
if(string.IsNullOrEmpty(value))
{
return "";
}
//对于byte[]值和object不做处理
string type=ConvertSqlType(column).ToLower();
if(type.IndexOf("byte[]")>=0 || type.IndexOf("object")>=0)
{
return "";
}
if(type.IndexOf("guid")>=0)
{
value="new Guid(\""+ value +"\")";
}
else if(type.IndexOf("datetime")>=0)
{
int day=0;
if(int.TryParse(value,out day))
{
value="new DateTime(1900,1,1).AddDays("+ day +")";
}
else
{
value="DateTime.Parse(\""+ value +"\")";
}
}
else
{
#region 获取第一个单引号到最后一个单引号之间的字符串
int start=value.IndexOf("'");
int end=value.LastIndexOf("'");
if(start>=0 && end>=0 && start<=end)
{
value=value.Substring(start+1,end-1-start);
}
#endregion
if(type.IndexOf("bool")>=0)
{
//bool类型转换
value=(value=="1"?"true":"false");
}
else if(type.IndexOf("string")>=0)
{
//string类型转换
value="\""+value+"\"";
}
else if(type.IndexOf("decimal")>=0)
{
//decimal类型转换
value=value+"M";
}
}
return value;
}
/// <summary>
/// 检查字段是否有默认值
/// </summary>
/// <param name="column">ColumnSchema类型</param>
/// <returns></returns>
public bool IsDefault(ColumnSchema column)
{
return !string.IsNullOrEmpty(GetDefault(column));
}
</script>
[Serializable]
public class <%=FirstToUpper(SourceTable.Name)%>
{
#region private fileds
<%for(int i=0;i<SourceTable.Columns.Count;i++) {%>
private <%=ConvertSqlType(SourceTable.Columns[i])%> <%=FirstToLower(SourceTable.Columns[i].Name)%><%if(IsDefault(SourceTable.Columns[i])){%>=<%=GetDefault(SourceTable.Columns[i])%><%}%>;
<%}%>
#endregion
#region public property
<%for(int i=0;i<SourceTable.Columns.Count;i++) {%>
/// <summary>
/// <%=SourceTable.Columns[i].Description%>
/// </summary>
/// <returns></returns>
public <%=ConvertSqlType(SourceTable.Columns[i])%> <%=FirstToUpper(SourceTable.Columns[i].Name)%>
{
get
{
return <%=FirstToLower(SourceTable.Columns[i].Name)%>;
}
set
{
<%=FirstToLower(SourceTable.Columns[i].Name)%>=value;
}
}
<%}%>
#endregion
}