• 其他层次的模板


    在【CodeSmith快速入门之四:模型层的生成】中,我们介绍了模型层模板的生成,在本章我们将会介绍其他层次的模板。

    因为每个层次的模板编写都比较类似,所以这次不会对模板代码进行详细的说明,尽请谅解,谢谢

    1、数据访问接口代码生成模版


    <%-- 
    Name: 数据访问接口代码生成模版
    Author: Fencer
    Description: 根据数据库的内容生成数据访问层接口
    Version: V1.
    0 新规初成
    --%>
    <%@ CodeTemplate Language="C#" TargetLanguage="Text" ResponseEncoding="UTF-8"%>
    <%Property Name="Namespace" Type="String" Default="IDAL" Category="内容" Description="命名空间名称" %>
    <%Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="内容" Description="数据源表" %>
    <%Property Name="ObjectName" Type="String" Category="注释" Description="对象名称,为生成注释而用" %>
    <%@ Assembly Name="System.Data" %>
    <%@ Assembly Name="SchemaExplorer" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="SchemaExplorer" %>
    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace 
    <%=Namespace%>
    {
        using Model;
        
        /// 
    <summary>
        /// 
    <%=ObjectName%>的数据访问操作
        /// 
    </summary>
        public interface I
    <%=GetModelName(SourceTable)%>
        {
            /// 
    <summary>
            /// 添加
    <%=ObjectName%>
            /// 
    </summary>
            /// 
    <param name="<%=GetModelParameterName(SourceTable)%>"><%=ObjectName%></param>
            /// 
    <returns>最新编号</returns>
            int Add
    <%=GetModelName(SourceTable)%>(<%=GetModelName(SourceTable)%> <%=GetModelParameterName(SourceTable)%>);
            
            /// 
    <summary>
            /// 更新
    <%=ObjectName%>
            /// 
    </summary>
            /// 
    <param name="<%=GetModelParameterName(SourceTable)%>"><%=ObjectName%></param>
            /// 
    <returns>bool</returns>
            bool Update
    <%=GetModelName(SourceTable)%>(<%=GetModelName(SourceTable)%> <%=GetModelParameterName(SourceTable)%>);
            
            /// 
    <summary>
            /// 根据ID删除
    <%=ObjectName%>
            /// 
    </summary>
            /// 
    <param name="<%=GetPrimaryKeyFieldName(SourceTable)%>"><%=ObjectName%>ID</param>
            /// 
    <returns>bool</returns>
            bool Delete
    <%=GetModelName(SourceTable)%>By<%=GetPrimaryKeyPropertyName(SourceTable)%>(<%=GetPrimaryKeyType(SourceTable)%> <%=GetPrimaryKeyFieldName(SourceTable)%>);
            
            /// 
    <summary>
            /// 根据ID查询
    <%=ObjectName%>
            /// 
    </summary>
            /// 
    <param name="<%=GetPrimaryKeyFieldName(SourceTable)%>"><%=ObjectName%>ID</param>
            /// 
    <returns><%=ObjectName%>对象</returns>
            
    <%=GetModelName(SourceTable)%> Get<%=GetModelName(SourceTable)%>By<%=GetPrimaryKeyPropertyName(SourceTable)%>(<%=GetPrimaryKeyType(SourceTable)%> <%=GetPrimaryKeyFieldName(SourceTable)%>);
            
            /// 
    <summary>
            /// 获得所有
    <%=ObjectName%>
            /// 
    </summary>
            /// 
    <returns><%=ObjectName%>集合</returns>
            IList
    <<%=GetModelName(SourceTable)%>> GetAll<%=GetModelName(SourceTable)%>s();
        }
    }

    <script runat="template">
        public string GetClassName(TableSchema table)
        {
            string tempTable;
            
    if (table.Name.EndsWith("s"))
            {
                tempTable 
    = table.Name.Substring(0,table.Name.Length-1);
            }
            
    else
            {
                tempTable 
    = table.Name;
            }
            
    return tempTable;
        }
        
        public string GetModelName(TableSchema table)
        {
            
    return ConvertToPascal(GetClassName(table));
        }
        
        public string GetModelParameterName(TableSchema table)
        {
            
    return ConvertToCamel(GetClassName(table));
        }
        
        public string GetPrimaryKeyType(TableSchema table)
        {
            
    if (table.PrimaryKey != null)
            {
                
    if (table.PrimaryKey.MemberColumns.Count == 1)
                {
                    
    return GetCSharpDataTypeByDBColumn(table.PrimaryKey.MemberColumns[0]);
                }
                
    else
                {
                    
    throw new ApplicationException("此模板只支持单个列的主键");
                }
            }
            
    else
            {
                
    throw new ApplicationException("此模板需要有主键的表");
            }
        }
        
        public string GetPrimaryKeyName(TableSchema table)
        {
            
    if (table.PrimaryKey != null)
            {
                
    if (table.PrimaryKey.MemberColumns.Count == 1)
                {
                    
    return table.PrimaryKey.MemberColumns[0].Name;
                }
                
    else
                {
                    
    throw new ApplicationException("此模板只支持单个列的主键");
                }
            }
            
    else
            {
                
    throw new ApplicationException("此模板需要有主键的表");
            }
        }
        
        public string GetPrimaryKeyFieldName(TableSchema table)
        {
            
    return ConvertToCamel(GetPrimaryKeyName(table));
        }
        
        public string GetPrimaryKeyPropertyName(TableSchema table)
        {
            
    return ConvertToPascal(GetPrimaryKeyName(table));
        }
        
        public string GetCSharpDataTypeByDBColumn(ColumnSchema column)
        {
            
    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 string ConvertToPascal(string str)
        {
            
    return str.Substring(0,1).ToUpper() + str.Substring(1);
        }
        
        public string ConvertToCamel(string str)
        {
            
    return str.Substring(0,1).ToLower() + str.Substring(1);
        }
        
        public override string GetFileName()
        {
            
    return "I" + GetModelName(SourceTable) + ".cs";
        }
    </script>

    2、数据访问层代码生成模版


    <%-- 
    Name: 数据访问层代码生成模版
    Author: Fencer
    Description: 根据数据库的内容生成模型层代码
    Version: V1.
    0 新规初成
    --%>
    <%@ CodeTemplate Language="C#" TargetLanguage="Text" ResponseEncoding="UTF-8"%>
    <%Property Name="Namespace" Type="String" Default="SQLServerDAL" Category="内容" Description="命名空间名称" %>
    <%Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="内容" Description="数据源表" %>
    <%Property Name="ObjectName" Type="String" Category="注释" Description="对象名称,为生成注释而用" %>
    <%@ Assembly Name="System.Data" %>
    <%@ Assembly Name="SchemaExplorer" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="SchemaExplorer" %>
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Data.SqlClient;

    namespace 
    <%=Namespace%>
    {
        using IDAL;
        using Model;
        using Common;
        
        /// 
    <summary>
        /// 
    <%=ObjectName%>的数据访问操作
        /// 
    </summary>
        public class 
    <%=GetModelName(SourceTable)%>s : I<%=GetModelName(SourceTable)%>
        {
            /// 
    <summary>
            /// 添加
    <%=ObjectName%>
            /// 
    </summary>
            /// 
    <param name="<%=GetModelParameterName(SourceTable)%>"><%=ObjectName%></param>
            /// 
    <returns>最新编号</returns>
            public int Add
    <%=GetModelName(SourceTable)%>(<%=GetModelName(SourceTable)%> <%=GetModelParameterName(SourceTable)%>)
            {
                string sql = 
    <%=GetInsertSql()%>;
                
                SqlParameter[] pas = new SqlParameter[]
                    {
                        
    <%
                            
    for(int i=0; i<SourceTable.NonPrimaryKeyColumns.Count; i++)
                            {
                                ColumnSchema column 
    = SourceTable.NonPrimaryKeyColumns[i];
                        
    %>
                        new SqlParameter("@
    <%=column.Name%>",SqlDbType.<%=GetSqlDbType(column)%>,<%=column.Size%>)<%= (i==(SourceTable.NonPrimaryKeyColumns.Count-1)? "":",")%>
                        
    <%
                            }
                        
    %>
                    };
                
                
    <%
                    
    for(int i=0; i<SourceTable.NonPrimaryKeyColumns.Count; i++)
                    {
                
    %>
                pas[
    <%=i%>].Value = <%=GetModelParameterName(SourceTable)%>.<%=SourceTable.NonPrimaryKeyColumns[i].Name%>;
                
    <%
                    }
                
    %>
                
                return Convert.ToInt32(SqlHelper.ExecuteScalar(SqlHelper.CONN_STRING, CommandType.Text, sql, pas));
            }
            
            /// 
    <summary>
            /// 更新
    <%=ObjectName%>
            /// 
    </summary>
            /// 
    <param name="<%=GetModelParameterName(SourceTable)%>"><%=ObjectName%></param>
            /// 
    <returns>bool</returns>
            public bool Update
    <%=GetModelName(SourceTable)%>(<%=GetModelName(SourceTable)%> <%=GetModelParameterName(SourceTable)%>)
            {
                string sql = 
    <%=GetUpdateSql()%>;
                
                SqlParameter[] pas = new SqlParameter[]
                    {
                        
    <%
                            
    for(int i=0; i<SourceTable.NonPrimaryKeyColumns.Count; i++)
                            {
                                ColumnSchema column 
    = SourceTable.NonPrimaryKeyColumns[i];
                        
    %>
                        new SqlParameter("@
    <%=column.Name%>",SqlDbType.<%=GetSqlDbType(column)%>,<%=column.Size%>),
                        
    <%
                            }
                        
    %>
                        new SqlParameter("@
    <%=GetPrimaryKeyName(SourceTable)%>",SqlDbType.<%=GetSqlDbType(GetPrimaryKeyColumn(SourceTable))%>,<%=GetPrimaryKeySize(SourceTable)%>)
                    };
                
                
    <%
                    
    for(int i=0; i<=SourceTable.NonPrimaryKeyColumns.Count; i++)
                    {
                        
    if (i < SourceTable.NonPrimaryKeyColumns.Count)
                        {
                
    %>
                pas[
    <%=i%>].Value = <%=GetModelParameterName(SourceTable)%>.<%=SourceTable.NonPrimaryKeyColumns[i].Name%>;
                
    <%
                        }
                        
    else
                        {
                
    %>
                pas[
    <%=i%>].Value = <%=GetModelParameterName(SourceTable)%>.<%=GetPrimaryKeyName(SourceTable)%>;
                
    <%
                        }
                    }
                
    %>
                
                int rows = SqlHelper.ExecuteNonQuery(SqlHelper.CONN_STRING,CommandType.Text,sql,pas);
                return (rows == 1);
            } 
            
            /// 
    <summary>
            /// 根据ID删除
    <%=ObjectName%>
            /// 
    </summary>
            /// 
    <param name="<%=GetPrimaryKeyFieldName(SourceTable)%>"><%=ObjectName%>ID</param>
            /// 
    <returns>bool</returns>
            public bool Delete
    <%=GetModelName(SourceTable)%>By<%=GetPrimaryKeyPropertyName(SourceTable)%>(<%=GetPrimaryKeyType(SourceTable)%> <%=GetPrimaryKeyFieldName(SourceTable)%>)
            {
                string sql = "DELETE FROM 
    <%=SourceTable.Name%> WHERE <%=GetPrimaryKeyName(SourceTable)%>=@<%=GetPrimaryKeyName(SourceTable)%>";
                
                SqlParameter pa = new SqlParameter("@
    <%=GetPrimaryKeyName(SourceTable)%>",SqlDbType.<%=GetPrimaryKeySqlDbType(SourceTable)%>,<%=GetPrimaryKeySize(SourceTable)%>);
                pa.Value = 
    <%=GetPrimaryKeyFieldName(SourceTable)%>;
                
                int rows = SqlHelper.ExecuteNonQuery(SqlHelper.CONN_STRING,CommandType.Text,sql,pa);
                
                return (rows == 1);
            }
            
            /// 
    <summary>
            /// 根据ID查询
    <%=ObjectName%>
            /// 
    </summary>
            /// 
    <param name="<%=GetPrimaryKeyFieldName(SourceTable)%>"><%=ObjectName%>ID</param>
            /// 
    <returns><%=ObjectName%>对象</returns>
            public 
    <%=GetModelName(SourceTable)%> Get<%=GetModelName(SourceTable)%>By<%=GetPrimaryKeyPropertyName(SourceTable)%>(<%=GetPrimaryKeyType(SourceTable)%> <%=GetPrimaryKeyFieldName(SourceTable)%>)
            {
                string sql = 
    <%=GetSelectOneModelSql()%>;
                
                SqlParameter pa = new SqlParameter("@
    <%=GetPrimaryKeyName(SourceTable)%>",SqlDbType.<%=GetPrimaryKeySqlDbType(SourceTable)%>,<%=GetPrimaryKeySize(SourceTable)%>);
                pa.Value = 
    <%=GetPrimaryKeyFieldName(SourceTable)%>;
                
                using(SqlDataReader rdr = SqlHelper.ExecuteReader(
                    SqlHelper.CONN_STRING,CommandType.Text,sql,pa))
                {
                    if (rdr.Read())
                    {
                        
    <%=GetModelName(SourceTable)%> <%=GetModelParameterName(SourceTable)%> = new <%=GetModelName(SourceTable)%>();
                        
    <%
                            foreach(ColumnSchema column in SourceTable.Columns)
                            {
                        
    %>
                        
    <%=GetModelParameterName(SourceTable)%>.<%=column.Name%> = (<%=GetCSharpDataTypeByDBColumn(column)%>)rdr["<%=column.Name%>"];
                        
    <%
                            }
                        
    %>
                        
                        return 
    <%=GetModelParameterName(SourceTable)%>;
                    }
                }
                
                return null;
            }
            
            /// 
    <summary>
            /// 获得所有
    <%=ObjectName%>
            /// 
    </summary>
            /// 
    <returns><%=ObjectName%>集合</returns>
            public IList
    <<%=GetModelName(SourceTable)%>> GetAll<%=GetModelName(SourceTable)%>s()
            {
                string sql = 
    <%=GetSelectAllModelSql()%>;
                
                IList
    <<%=GetModelName(SourceTable)%>> all<%=GetModelName(SourceTable)%>s = new List<<%=GetModelName(SourceTable)%>>();
                
                using(SqlDataReader rdr = SqlHelper.ExecuteReader(
                    SqlHelper.CONN_STRING,CommandType.Text,sql))
                {
                    while (rdr.Read())
                    {
                        
    <%=GetModelName(SourceTable)%> <%=GetModelParameterName(SourceTable)%> = new <%=GetModelName(SourceTable)%>();
                        
    <%
                            foreach(ColumnSchema column in SourceTable.Columns)
                            {
                        
    %>
                        
    <%=GetModelParameterName(SourceTable)%>.<%=column.Name%> = (<%=GetCSharpDataTypeByDBColumn(column)%>)rdr["<%=column.Name%>"];
                        
    <%
                            }
                        
    %>
                        
                        all
    <%=GetModelName(SourceTable)%>s.Add(<%=GetModelParameterName(SourceTable)%>);
                    }
                }
                
                return all
    <%=GetModelName(SourceTable)%>s;
            }
        }
    }

    <script runat="template">
        public string GetClassName(TableSchema table)
        {
            string tempTable;
            
    if (table.Name.EndsWith("s"))
            {
                tempTable 
    = table.Name.Substring(0,table.Name.Length-1);
            }
            
    else
            {
                tempTable 
    = table.Name;
            }
            
    return tempTable;
        }
        
        public string GetModelName(TableSchema table)
        {
            
    return ConvertToPascal(GetClassName(table));
        }
        
        public string GetModelParameterName(TableSchema table)
        {
            
    return ConvertToCamel(GetClassName(table));
        }
        
        public string GetPrimaryKeyType(TableSchema table)
        {
            
    if (table.PrimaryKey != null)
            {
                
    if (table.PrimaryKey.MemberColumns.Count == 1)
                {
                    
    return GetCSharpDataTypeByDBColumn(table.PrimaryKey.MemberColumns[0]);
                }
                
    else
                {
                    
    throw new ApplicationException("此模板只支持单个列的主键");
                }
            }
            
    else
            {
                
    throw new ApplicationException("此模板需要有主键的表");
            }
        }
        
        public ColumnSchema GetPrimaryKeyColumn(TableSchema table)
        {
            
    if (table.PrimaryKey != null)
            {
                
    if (table.PrimaryKey.MemberColumns.Count == 1)
                {
                    
    return table.PrimaryKey.MemberColumns[0];
                }
                
    else
                {
                    
    throw new ApplicationException("此模板只支持单个列的主键");
                }
            }
            
    else
            {
                
    throw new ApplicationException("此模板需要有主键的表");
            }
        }
        
        public string GetPrimaryKeyName(TableSchema table)
        {
            
    if (table.PrimaryKey != null)
            {
                
    if (table.PrimaryKey.MemberColumns.Count == 1)
                {
                    
    return table.PrimaryKey.MemberColumns[0].Name;
                }
                
    else
                {
                    
    throw new ApplicationException("此模板只支持单个列的主键");
                }
            }
            
    else
            {
                
    throw new ApplicationException("此模板需要有主键的表");
            }
        }
        
        public string GetPrimaryKeySize(TableSchema table)
        {
            
    return table.PrimaryKey.MemberColumns[0].Size.ToString();
        }
        
        public string GetPrimaryKeySqlDbType(TableSchema table)
        {
            
    return GetSqlDbType(table.PrimaryKey.MemberColumns[0]);
        }
        
        public string GetPrimaryKeyFieldName(TableSchema table)
        {
            
    return ConvertToCamel(GetPrimaryKeyName(table));
        }
        
        public string GetPrimaryKeyPropertyName(TableSchema table)
        {
            
    return ConvertToPascal(GetPrimaryKeyName(table));
        }
        
        public string GetInsertSql()
        {
            string sql 
    = ""INSERT INTO " + SourceTable.Name + "(";
            foreach(ColumnSchema column in SourceTable.NonPrimaryKeyColumns)
            {
                sql += column.Name + 
    ",";
            }
            sql = sql.Substring(0,sql.Length-1);
            sql += 
    ")" + ";
            
            sql 
    += " " values(";
            foreach(ColumnSchema column in SourceTable.NonPrimaryKeyColumns)
            {
                sql += 
    "@" + column.Name + ",";
            }
            sql = sql.Substring(0,sql.Length-1);
            sql += 
    ");" +  ";
            sql 
    += " " SELECT SCOPE_IDENTITY();"";
            
            
    return sql;
        }
        
        public string GetUpdateSql()
        {
            string sql 
    = ""UPDATE " + SourceTable.Name + " " + ";
            sql 
    += " "SET ";
            foreach(ColumnSchema column in SourceTable.NonPrimaryKeyColumns)
            {
                sql += column.Name + 
    "=@" + column.Name + ",";
            }
            sql = sql.Substring(0,sql.Length-1);
            sql += 
    " " + ";
            
            sql 
    += " "WHERE " + GetPrimaryKeyName(SourceTable) + "=@" + GetPrimaryKeyName(SourceTable) + """;
            
            
    return sql;
        }
        
        public string GetSelectOneModelSql()
        {
            string sql 
    = ""SELECT ";    
            foreach(ColumnSchema column in SourceTable.Columns)
            {
                sql += column.Name + 
    ",";
            }
            sql = sql.Substring(0,sql.Length-1);
            sql += 
    " " + ";
            
            sql 
    += " "FROM " + SourceTable.Name + " " + ";
            sql 
    += " "WHERE " + GetPrimaryKeyName(SourceTable) + "=@" + GetPrimaryKeyName(SourceTable) + """;
            
            
    return sql;
        }
        
        public string GetSelectAllModelSql()
        {
            string sql 
    = ""SELECT ";    
            foreach(ColumnSchema column in SourceTable.Columns)
            {
                sql += column.Name + 
    ",";
            }
            sql = sql.Substring(0,sql.Length-1);
            sql += 
    " " + ";
            
            sql 
    += " "FROM " + SourceTable.Name + """;
            
            
    return sql;
        }

        
        public string GetCSharpDataTypeByDBColumn(ColumnSchema column)
        {
            
    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 string GetSqlDbType(ColumnSchema column)
        {
            
    switch (column.NativeType)
            {
                
    case "bigint"return "BigInt";
                
    case "binary"return "Binary";
                
    case "bit"return "Bit";
                
    case "char"return "Char";
                
    case "datetime"return "DateTime";
                
    case "decimal"return "Decimal";
                
    case "float"return "Float";
                
    case "image"return "Image";
                
    case "int"return "Int";
                
    case "money"return "Money";
                
    case "nchar"return "NChar";
                
    case "ntext"return "NText";
                
    case "numeric"return "Decimal";
                
    case "nvarchar"return "NVarChar";
                
    case "real"return "Real";
                
    case "smalldatetime"return "SmallDateTime";
                
    case "smallint"return "SmallInt";
                
    case "smallmoney"return "SmallMoney";
                
    case "sql_variant"return "Variant";
                
    case "sysname"return "NChar";
                
    case "text"return "Text";
                
    case "timestamp"return "Timestamp";
                
    case "tinyint"return "TinyInt";
                
    case "uniqueidentifier"return "UniqueIdentifier";
                
    case "varbinary"return "VarBinary";
                
    case "varchar"return "VarChar";
                
    defaultreturn "__UNKNOWN__" + column.NativeType;
            }
        }
        
        public string ConvertToPascal(string str)
        {
            
    return str.Substring(0,1).ToUpper() + str.Substring(1);
        }
        
        public string ConvertToCamel(string str)
        {
            
    return str.Substring(0,1).ToLower() + str.Substring(1);
        }
        
        public override string GetFileName()
        {
            
    return GetModelName(SourceTable) + "s.cs";
        }
    </script>

    3、数据访问工厂代码生成模版


    <%-- 
    Name: 数据访问工厂代码生成模版
    Author: Fencer
    Description: 根据数据库的内容生成数据访问工厂
    Version: V1.
    0 新规初成
    --%>
    <%@ CodeTemplate Language="C#" TargetLanguage="Text" ResponseEncoding="UTF-8"%>
    <%Property Name="Namespace" Type="String" Default="DALFactory" Category="内容" Description="命名空间名称" %>
    <%Property Name="Database" Type="SchemaExplorer.DatabaseSchema" Category="内容" Description="目标数据库" %>
    <%@ Assembly Name="System.Data" %>
    <%@ Assembly Name="SchemaExplorer" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="SchemaExplorer" %>
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Configuration;
    using System.Reflection;

    namespace 
    <%=Namespace%>
    {
        using IDAL;
        
        /// 
    <summary>
        /// 数据访问工厂
        /// 
    </summary>
        public sealed class DataAccess
        {
            private static readonly string path = ConfigurationManager.AppSettings["DAL"];
            
            
    <%
                foreach(TableSchema table in Database.Tables)
                {
            
    %>
            /// 
    <summary>
            /// 
            /// 
    </summary>
            /// 
    <returns>接口</returns>
            public static I
    <%=table.Name%> Create<%=table.Name%>()
            {
                string className = path + ".
    <%=table.Name%>s";
                return (I
    <%=table.Name%>)Assembly.Load(path).CreateInstance(className);
            }
            
            
    <%    
                }
            
    %>
        }
    }

    <script runat="template">
        public override string GetFileName()
        {
            
    return "DataAccess.cs";
        }
    </script>

    4、业务层代码生成模版


    <%-- 
    Name: 业务层代码生成模版
    Author: Fencer
    Description: 根据数据库的内容生成业务层代码
    Version: V1.
    0 新规初成
    --%>
    <%@ CodeTemplate Language="C#" TargetLanguage="Text" ResponseEncoding="UTF-8"%>
    <%Property Name="BLLNamespace" Type="String" Default="BLL" Category="内容" Description="业务层命名空间名称" %>
    <%Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="内容" Description="数据源表" %>
    <%Property Name="ObjectName" Type="String" Category="注释" Description="对象名称,为生成注释而用" %>
    <%@ Assembly Name="System.Data" %>
    <%@ Assembly Name="SchemaExplorer" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="SchemaExplorer" %>
    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace 
    <%=BLLNamespace%>
    {
        using IDAL;
        using Model;
        using DALFactory;
        
        /// 
    <summary>
        /// 
    <%=ObjectName%>的业务处理类
        /// 
    </summary>
        public class 
    <%=GetModelName(SourceTable)%>BLL
        {
            private static readonly I
    <%=GetModelName(SourceTable)%> dal = DataAccess.Create<%=GetModelName(SourceTable)%>();
            
            /// 
    <summary>
            /// 添加
    <%=ObjectName%>
            /// 
    </summary>
            /// 
    <param name="<%=GetModelParameterName(SourceTable)%>"><%=ObjectName%></param>
            /// 
    <returns>最新编号</returns>
            public static int Add
    <%=GetModelName(SourceTable)%>(<%=GetModelName(SourceTable)%> <%=GetModelParameterName(SourceTable)%>)
            {
                return dal.Add
    <%=GetModelName(SourceTable)%>(<%=GetModelParameterName(SourceTable)%>);
            }
            
            /// 
    <summary>
            /// 更新
    <%=ObjectName%>
            /// 
    </summary>
            /// 
    <param name="<%=GetModelParameterName(SourceTable)%>"><%=ObjectName%></param>
            /// 
    <returns>bool</returns>
            public static bool Update
    <%=GetModelName(SourceTable)%>(<%=GetModelName(SourceTable)%> <%=GetModelParameterName(SourceTable)%>)
            {
                return dal.Update
    <%=GetModelName(SourceTable)%>(<%=GetModelParameterName(SourceTable)%>);
            }
            
            /// 
    <summary>
            /// 根据ID删除
    <%=ObjectName%>
            /// 
    </summary>
            /// 
    <param name="<%=GetPrimaryKeyFieldName(SourceTable)%>"><%=ObjectName%>ID</param>
            /// 
    <returns>bool</returns>
            public static bool Delete
    <%=GetModelName(SourceTable)%>By<%=GetPrimaryKeyPropertyName(SourceTable)%>(<%=GetPrimaryKeyType(SourceTable)%> <%=GetPrimaryKeyFieldName(SourceTable)%>)
            {
                return dal.Delete
    <%=GetModelName(SourceTable)%>By<%=GetPrimaryKeyPropertyName(SourceTable)%>(<%=GetPrimaryKeyFieldName(SourceTable)%>);
            }
            
            /// 
    <summary>
            /// 根据ID查询
    <%=ObjectName%>
            /// 
    </summary>
            /// 
    <param name="<%=GetPrimaryKeyFieldName(SourceTable)%>"><%=ObjectName%>ID</param>
            /// 
    <returns><%=ObjectName%>对象</returns>
            public static 
    <%=GetModelName(SourceTable)%> Get<%=GetModelName(SourceTable)%>By<%=GetPrimaryKeyPropertyName(SourceTable)%>(<%=GetPrimaryKeyType(SourceTable)%> <%=GetPrimaryKeyFieldName(SourceTable)%>)
            {
                return dal.Get
    <%=GetModelName(SourceTable)%>By<%=GetPrimaryKeyPropertyName(SourceTable)%>(<%=GetPrimaryKeyFieldName(SourceTable)%>);
            }
            
            /// 
    <summary>
            /// 获得所有
    <%=ObjectName%>
            /// 
    </summary>
            /// 
    <returns><%=ObjectName%>集合</returns>
            public static IList
    <<%=GetModelName(SourceTable)%>> GetAll<%=GetModelName(SourceTable)%>s()
            {
                return dal.GetAll
    <%=GetModelName(SourceTable)%>s();
            }
        }
    }

    <script runat="template">
        public string GetClassName(TableSchema table)
        {
            string tempTable;
            
    if (table.Name.EndsWith("s"))
            {
                tempTable 
    = table.Name.Substring(0,table.Name.Length-1);
            }
            
    else
            {
                tempTable 
    = table.Name;
            }
            
    return tempTable;
        }
        
        public string GetModelName(TableSchema table)
        {
            
    return ConvertToPascal(GetClassName(table));
        }
        
        public string GetModelParameterName(TableSchema table)
        {
            
    return ConvertToCamel(GetClassName(table));
        }
        
        public string GetPrimaryKeyName(TableSchema table)
        {
            
    if (table.PrimaryKey != null)
            {
                
    if (table.PrimaryKey.MemberColumns.Count == 1)
                {
                    
    return table.PrimaryKey.MemberColumns[0].Name;
                }
                
    else
                {
                    
    throw new ApplicationException("此模板只支持单个列的主键");
                }
            }
            
    else
            {
                
    throw new ApplicationException("此模板需要有主键的表");
            }
        }
        
        public string GetPrimaryKeyType(TableSchema table)
        {
            
    if (table.PrimaryKey != null)
            {
                
    if (table.PrimaryKey.MemberColumns.Count == 1)
                {
                    
    return GetCSharpDataTypeByDBColumn(table.PrimaryKey.MemberColumns[0]);
                }
                
    else
                {
                    
    throw new ApplicationException("此模板只支持单个列的主键");
                }
            }
            
    else
            {
                
    throw new ApplicationException("此模板需要有主键的表");
            }
        }
        
        public string GetCSharpDataTypeByDBColumn(ColumnSchema column)
        {
            
    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 string GetPrimaryKeyFieldName(TableSchema table)
        {
            
    return ConvertToCamel(GetPrimaryKeyName(table));
        }
        
        public string GetPrimaryKeyPropertyName(TableSchema table)
        {
            
    return ConvertToPascal(GetPrimaryKeyName(table));
        }
        
        public string ConvertToPascal(string str)
        {
            
    return str.Substring(0,1).ToUpper() + str.Substring(1);
        }
        
        public string ConvertToCamel(string str)
        {
            
    return str.Substring(0,1).ToLower() + str.Substring(1);
        }
        
        public override string GetFileName()
        {
            
    return GetModelName(SourceTable) + "BLL.cs";
        }
    </script>

    好了,到本章为止主要的模板就都已经开发完了(此模板都比较简单,大家可以根据实际情况进行修改)  下载所有的模板(附带SqlHelper)。

    问题:每次代码生成时都需要一个个模板运行,然后COPY->PASTE,是不是太麻烦了,下次会跟大家介绍怎么进行模板的调用,“一键”搭建起项目,谢谢。

  • 相关阅读:
    一个例子说明如何在DataSnap中使用FireDAC
    DataSnap Demo:TFDConnection、最大连接数、客户端回叫功能、多线程模拟、压力测试等
    DataSnap Demo:TFDConnection、最大连接数、客户端回叫功能、多线程模拟、压力测试等
    Delphi2010中DataSnap技术网摘
    Delphi2010中DataSnap技术网摘
    推荐大家使用的CSS书写规范、顺序
    Windows autoKeras的下载与安装连接
    vscode Python 运行环境配置
    react框架
    关于k Line Chart (k线图)
  • 原文地址:https://www.cnblogs.com/lyl6796910/p/3719884.html
Copyright © 2020-2023  润新知