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
}

...全文
464 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ating_Ann 2011-09-16
  • 打赏
  • 举报
回复
如何不用数据表中的值,手动填写属性,让他生成实体类?
atwind1 2010-01-27
  • 打赏
  • 举报
回复
你怎么引用自定义类的?
wuyq11 2009-05-01
  • 打赏
  • 举报
回复
陌上花花 2009-05-01
  • 打赏
  • 举报
回复
代码好长啊。
wosizy 2009-05-01
  • 打赏
  • 举报
回复
把问题说清楚///

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧