Brad为我们提供了T4模板,因为公司一直在使用CodeSmith,故为其写了一个CodeSmith的模板,代码如下:
- <%--
- Name:EntityTemplates
- Author:Qi Fei
- Description:Generate a entity file in C#
- --%>
- <%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" Description="" ResponseEncoding="UTF-8" %>
- <%@ Property Name="Namespace" Type="System.String" Default="TianChenMeiKuang.Entity" Optional="False" Category="Strings" Description="实体类命名空间" %>
- <%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="源表" %>
- <%@ Assembly Name="SchemaExplorer" %>
- <%@ Assembly Name="System.Data" %>
- <%@ Import Namespace="SchemaExplorer" %>
- <%@ Import Namespace="System.Data" %>
- /**********************************************************
- Name:<%= GetClassName(SourceTable) %>
- Author:
- Date:<%=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") %>
- Description:
- Modify Remark:
- **********************************************************/
- using System;
- using WebApp.Matrix.Data;
- namespace <%=Namespace%>
- {
- /// <summary>
- /// This Entity is Mapping To [<%=SourceTable.Name%>] Table
- /// Remark Ignore Attribute for the field when it is not need mapping
- /// </summary>
- [Serializable]
- [TableName("[<%=SourceTable.Name%>]")]
- <%
- ColumnSchema primaryKeyColumn = GetPrimaryKeyColumn();
- if(primaryKeyColumn != null)
- {
- if(Convert.ToBoolean(primaryKeyColumn.ExtendedProperties["CS_isIdentity"].Value)==true){ %>
- [PrimaryKey("<%=primaryKeyColumn.Name%>", autoIncrement=true)]
- <% }
- else {
- %>
- [PrimaryKey("<%=primaryKeyColumn.Name%>", autoIncrement=false)]
- <% }
- }%>
- public class <%= GetClassName(SourceTable) %>
- {
- <% for (int i = 0; i < SourceTable.Columns.Count; i++) { %>
- /// <summary>
- /// <%= SourceTable.Columns[i].Name %>
- /// </summary>
- public <%= GetCSharpVariableType(SourceTable.Columns[i]) %> <%= GetPropertyName(SourceTable.Columns[i]) %>
- {
- get; set;
- }
- <% if (i < SourceTable.Columns.Count - 1) Response.Write("\r\n"); %>
- <% } %>
- /// <summary>
- /// Equals
- /// </summary>
- public override bool Equals(object obj)
- {
- <%= GetClassName(SourceTable) %> other = obj as <%= GetClassName(SourceTable) %>;
- if (<%=GetFirstKeyCondition()%>)
- {
- return false;
- }
- if (<%=GetTwoKeyCondition()%>)
- {
- return false;
- }
- return true;
- }
- /// <summary>
- /// GetHashCode
- /// </summary>
- public override int GetHashCode()
- {
- return base.GetHashCode();
- }
- }
- }
- <script runat="template">
- public string GetClassName(TableSchema table)
- {
- string className = table.Name;
- return className;
- }
- public string GetPropertyName(ColumnSchema column)
- {
- string propertyName = column.Name;
- return propertyName;
- }
- public string GetFieldName(ColumnSchema column)
- {
- string propertyName = column.Name;
- return propertyName;
- }
- public ColumnSchema GetPrimaryKeyColumn()
- {
- for (int i = 0; i < SourceTable.Columns.Count; i++)
- {
- if(SourceTable.Columns[i].IsPrimaryKeyMember)
- {
- return SourceTable.Columns[i];
- }
- }
- return null;
- }
- public string GetKey()
- {
- for (int i = 0; i < SourceTable.Columns.Count; i++)
- {
- if(SourceTable.Columns[i].IsPrimaryKeyMember)
- {
- return SourceTable.Columns[i].Name;
- }
- }
- return "GetHashCode().ToString()";
- }
- public string GetCSharpVariableType(ColumnSchema column)
- {
- switch (column.DataType)
- {
- case DbType.AnsiString: return "string";
- case DbType.AnsiStringFixedLength: return "string";
- case DbType.Binary: return "Nullable<int>";
- case DbType.Boolean: if(column.AllowDBNull){return "Nullable<bool>";}else{return "bool";};
- case DbType.Byte: return "int";
- case DbType.Currency: if(column.AllowDBNull){return "Nullable<decimal>";}else{return "decimal";};
- case DbType.Date: if(column.AllowDBNull){return "Nullable<DateTime>";}else{return "DateTime";};
- case DbType.DateTime: if(column.AllowDBNull){return "Nullable<DateTime>";}else{return "DateTime";};
- case DbType.Decimal: if(column.AllowDBNull){return "Nullable<decimal>";}else{return "decimal";};
- case DbType.Double: if(column.AllowDBNull){return "Nullable<double>";}else{return "double";};
- case DbType.Guid: return "Guid";
- case DbType.Int16: if(column.AllowDBNull){return "Nullable<short>";}else{return "short";};
- case DbType.Int32: if(column.AllowDBNull){return "Nullable<int>";}else{return "int";};
- case DbType.Int64: if(column.AllowDBNull){return "Nullable<long>";}else{return "long";};
- case DbType.Object: return "object";
- case DbType.SByte: if(column.AllowDBNull){return "Nullable<sbyte>";}else{return "sbyte";};
- case DbType.Single: if(column.AllowDBNull){return "Nullable<float>";}else{return "float";};
- case DbType.String: return "string";
- case DbType.StringFixedLength: return "string";
- case DbType.Time: if(column.AllowDBNull){return "Nullable<TimeSpan>";}else{return "TimeSpan";};
- case DbType.UInt16: if(column.AllowDBNull){return "Nullable<ushort>";}else{return "ushort";};
- case DbType.UInt32: if(column.AllowDBNull){return "Nullable<uint>";}else{return "uint";};
- case DbType.UInt64: if(column.AllowDBNull){return "Nullable<ulong>";}else{return "ulong";};
- case DbType.VarNumeric: if(column.AllowDBNull){return "Nullable<decimal>";}else{return "decimal";};
- default:return "string";
- }
- }
- public string GetFirstKeyCondition()
- {
- string condition = " other==null";
- for (int i = 0; i < SourceTable.Columns.Count; i++)
- {
- var tempColumn = SourceTable.Columns[i];
- if(tempColumn.IsPrimaryKeyMember)
- {
- if(((bool)tempColumn.ExtendedProperties["CS_IsIdentity"].Value))
- {
- condition += " || this." + SourceTable.Columns[i].Name + " == 0";
- condition += " || other."+ SourceTable.Columns[i].Name + " == 0";
- }
- else
- {
- condition += " || string.IsNullOrEmpty(this." + SourceTable.Columns[i].Name + ")";
- condition += " || string.IsNullOrEmpty(other."+ SourceTable.Columns[i].Name + ")";
- }
- }
- }
- return condition;
- }
- public string GetTwoKeyCondition()
- {
- string condition = " ";
- for (int i = 0; i < SourceTable.Columns.Count; i++)
- {
- if(SourceTable.Columns[i].IsPrimaryKeyMember)
- {
- condition += " || this."+SourceTable.Columns[i].Name +" !=other."+SourceTable.Columns[i].Name;
- }
- }
- return condition.Substring(4,condition.Length-4).ToString();
- }
- public string GetHashCodeStr()
- {
- string hashCode = " ";
- for (int i = 0; i < SourceTable.Columns.Count; i++)
- {
- if(SourceTable.Columns[i].IsPrimaryKeyMember)
- {
- hashCode += "+\"|\" +this."+SourceTable.Columns[i].Name +".ToLower()";
- }
- }
- return hashCode.Substring(7,hashCode.Length-7).ToString();
- }
- public string GetDefaultValue(ColumnSchema column)
- {
- string DefaultValue = "";
- switch(column.DataType)
- {
- case DbType.Int16:
- case DbType.Int32:
- case DbType.Int64:
- DefaultValue = "0";
- break;
- case DbType.Decimal:
- DefaultValue = "0.000000M";
- break;
- case DbType.AnsiString:
- case DbType.String:
- case DbType.StringFixedLength:
- DefaultValue = "\"\"";
- break;
- case DbType.Date:
- case DbType.DateTime:
- case DbType.DateTime2:
- DefaultValue = "DateTime.Parse(\"1999-01-01 00:00:00\")";
- break;
- case DbType.Binary:
- DefaultValue = "new byte[] { }";
- break;
- case DbType.Boolean:
- DefaultValue = "False";
- break;
- case DbType.Byte:
- DefaultValue = "1";
- break;
- default:
- break;
- }
- return DefaultValue;
- }
- </script>
该模板只适用于但主键的环境,且主键必须为字符串类型,或者为自增长列。初步满足公司当前的需要。