使用T4模板,自动生成Dapper实体类

工具类DbHelper.ttinclude:

<#@ assembly name="System.Core.dll" #>
<#@ assembly name="System.Data.dll" #>
<#@ assembly name="System.Data.DataSetExtensions.dll" #>
<#@ assembly name="System.Xml.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>

<#+
    public class DbHelper
    {
        public static List<DbTable> GetDbTables(string connectionString, string database)
        {
            string sql = $@"SELECT obj.name as TableName ,prop.value  as TableRemark                            
from {database}.sys.objects obj 
left join {database}.sys.extended_properties prop on prop.major_id=obj.object_id and prop.minor_id=0
where obj.type=‘U‘ and obj.name<>‘sysdiagrams‘";
            DataTable dt = GetDataTable(connectionString, sql);
            return dt.Rows.Cast<DataRow>().Select(row => new DbTable
            {
                TableName = row.Field<string>("TableName"),
                TableRemark = row.Field<string>("TableRemark")??""
            }).ToList();
        }
        public static List<DbColumn> GetDbColumns(string connectionString, string database, string tableName)
        {
            #region SQL
            string sql = $@"
WITH indexCTE AS
(
    SELECT 
    ic.column_id,
    ic.object_id    
    FROM {database}.sys.indexes idx
    INNER JOIN {database}.sys.index_columns ic ON idx.index_id = ic.index_id AND idx.object_id = ic.object_id
    WHERE  idx.object_id =OBJECT_ID(‘{tableName}‘) AND idx.is_primary_key=1
)
    select
    CAST(CASE WHEN indexCTE.column_id IS NULL THEN 0 ELSE 1 END AS BIT) IsPrimaryKey,
    CAST(CASE WHEN colm.default_object_id =0 THEN 0 ELSE 1 END AS BIT) IsDefaultKey,
    colm.name ColumnName,
    systype.name ColumnType,
    colm.is_nullable IsNullable,
    prop.value Remark
    from {database}.sys.columns colm
    inner join {database}.sys.types systype on colm.system_type_id=systype.system_type_id and colm.user_type_id=systype.user_type_id
    left join {database}.sys.extended_properties prop on colm.object_id=prop.major_id and colm.column_id=prop.minor_id
    left join indexCTE ON colm.column_id=indexCTE.column_id AND colm.object_id=indexCTE.object_id                                        
    where colm.object_id=OBJECT_ID(‘{tableName}‘)
    order by colm.column_id";
            #endregion
            DataTable dt = GetDataTable(connectionString, sql);
            return dt.Rows.Cast<DataRow>().Select(row => new DbColumn()
            {
                IsPrimaryKey = row.Field<bool>("IsPrimaryKey"),
                IsDefaultKey = row.Field<bool>("IsDefaultKey"),
                ColumnName = row.Field<string>("ColumnName"),
                ColumnType = row.Field<string>("ColumnType"),
                IsNullable = row.Field<bool>("IsNullable"),
                Remark = row.Field<string>("Remark")??"",
            }).ToList();
        }

        public static DataTable GetDataTable(string connectionString, string commandText, params SqlParameter[] parms)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                SqlCommand command = connection.CreateCommand();
                command.CommandText = commandText;
                command.Parameters.AddRange(parms);
                SqlDataAdapter adapter = new SqlDataAdapter(command);

                DataTable dt = new DataTable();
                adapter.Fill(dt);

                return dt;
            }
        }

    }

    /// <summary>
    /// 表结构
    /// </summary>
    public sealed class DbTable
    {
        /// <summary>
        /// 表名称
        /// </summary>
        public string TableName { get; set; }
        /// <summary>
        /// 表描述
        /// </summary>
        public string TableRemark { get; set; }
    }
    /// <summary>
    /// 表字段结构
    /// </summary>
    public sealed class DbColumn
    {
        /// <summary>
        /// 是否主键
        /// </summary>
        public bool IsPrimaryKey { get; set; }
        /// <summary>
        /// 是否默认值
        /// </summary>
        public bool IsDefaultKey { get; set; }
        /// <summary>
        /// 字段名称
        /// </summary>
        public string ColumnName { get; set; }
        /// <summary>
        /// 字段类型
        /// </summary>
        public string ColumnType { get; set; }
        /// <summary>
        /// 是否允许空
        /// </summary>
        public bool IsNullable { get; set; }
        /// <summary>
        /// 描述
        /// </summary>
        public string Remark { get; set; }
        /// <summary>
        /// 数据库类型对应的C#类型
        /// </summary>
        public string CSharpType
        {
            get
            {
                return SqlServerDbTypeMap.MapCsharpType(ColumnType);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public Type CommonType
        {
            get
            {
                return SqlServerDbTypeMap.MapCommonType(ColumnType);
            }
        }

    }
    /// <summary>
    ///ORM 类型转换 
    /// </summary>
    public class SqlServerDbTypeMap
    {
        public static string MapCsharpType(string dbtype)
        {
            if (string.IsNullOrEmpty(dbtype)) return dbtype;
            dbtype = dbtype.ToLower();
            string csharpType = "object";
            switch (dbtype)
            {
                case "bigint": csharpType = "long"; break;
                case "binary": csharpType = "byte[]"; break;
                case "bit": csharpType = "bool"; break;
                case "char": csharpType = "string"; break;
                case "date": csharpType = "DateTime"; break;
                case "datetime": csharpType = "DateTime"; break;
                case "datetime2": csharpType = "DateTime"; break;
                case "datetimeoffset": csharpType = "DateTimeOffset"; break;
                case "decimal": csharpType = "decimal"; break;
                case "float": csharpType = "double"; break;
                case "image": csharpType = "byte[]"; break;
                case "int": csharpType = "int"; break;
                case "money": csharpType = "decimal"; break;
                case "nchar": csharpType = "string"; break;
                case "ntext": csharpType = "string"; break;
                case "numeric": csharpType = "decimal"; break;
                case "nvarchar": csharpType = "string"; break;
                case "real": csharpType = "Single"; break;
                case "smalldatetime": csharpType = "DateTime"; break;
                case "smallint": csharpType = "short"; break;
                case "smallmoney": csharpType = "decimal"; break;
                case "sql_variant": csharpType = "object"; break;
                case "sysname": csharpType = "object"; break;
                case "text": csharpType = "string"; break;
                case "time": csharpType = "TimeSpan"; break;
                case "timestamp": csharpType = "byte[]"; break;
                case "tinyint": csharpType = "byte"; break;
                case "uniqueidentifier": csharpType = "Guid"; break;
                case "varbinary": csharpType = "byte[]"; break;
                case "varchar": csharpType = "string"; break;
                case "xml": csharpType = "string"; break;
                default: csharpType = "object"; break;
            }
            return csharpType;
        }

        public static string MapDBType(string dbtype)
        {
            if (string.IsNullOrEmpty(dbtype)) return dbtype;
            dbtype = dbtype.ToLower();
            string csharpType = "object";
            switch (dbtype)
            {
                case "bigint": csharpType = "DbType.Int64"; break;
                case "binary": csharpType = "DbType.Binary"; break;
                case "bit": csharpType = "DbType.Boolean"; break;
                case "char": csharpType = "DbType.String"; break;
                case "date": csharpType = "DbType.DateTime"; break;
                case "datetime": csharpType = "DbType.DateTime"; break;
                case "datetime2": csharpType = "DbType.DateTime2"; break;
                case "datetimeoffset": csharpType = "DbType.DateTimeOffset"; break;
                case "decimal": csharpType = "DbType.Decimal"; break;
                case "float": csharpType = "DbType.Double"; break;
                case "image": csharpType = "DbType.Binary"; break;
                case "int": csharpType = "DbType.Int32"; break;
                case "money": csharpType = "DbType.Currency"; break;
                case "nchar": csharpType = "DbType.StringFixedLength"; break;
                case "ntext": csharpType = "DbType.String"; break;
                case "numeric": csharpType = "DbType.Decimal"; break;
                case "nvarchar": csharpType = "DbType.String"; break;
                case "real": csharpType = "DbType.Single"; break;
                case "smalldatetime": csharpType = "DbType.DateTime"; break;
                case "smallint": csharpType = "DbType.Int16"; break;
                case "smallmoney": csharpType = "DbType.Decimal"; break;
                case "sql_variant": csharpType = "DbType.Object"; break;
                case "sysname": csharpType = "DbType.Object"; break;
                case "text": csharpType = "DbType.String"; break;
                case "time": csharpType = "DbType.DateTime"; break;
                case "timestamp": csharpType = "DbType.Binary"; break;
                case "tinyint": csharpType = "DbType.Byte"; break;
                case "uniqueidentifier": csharpType = "DbType.Guid"; break;
                case "varbinary": csharpType = "DbType.Binary"; break;
                case "varchar": csharpType = "DbType.AnsiString"; break;
                case "xml": csharpType = "DbType.Xml"; break;
                default: csharpType = "DbType.Object"; break;
            }
            return csharpType;
        }

        public static Type MapCommonType(string dbtype)
        {
            if (string.IsNullOrEmpty(dbtype)) return Type.Missing.GetType();
            dbtype = dbtype.ToLower();
            Type commonType = typeof(object);
            switch (dbtype)
            {
                case "bigint": commonType = typeof(long); break;
                case "binary": commonType = typeof(byte[]); break;
                case "bit": commonType = typeof(bool); break;
                case "char": commonType = typeof(string); break;
                case "date": commonType = typeof(DateTime); break;
                case "datetime": commonType = typeof(DateTime); break;
                case "datetime2": commonType = typeof(DateTime); break;
                case "datetimeoffset": commonType = typeof(DateTimeOffset); break;
                case "decimal": commonType = typeof(decimal); break;
                case "float": commonType = typeof(double); break;
                case "image": commonType = typeof(byte[]); break;
                case "int": commonType = typeof(int); break;
                case "money": commonType = typeof(decimal); break;
                case "nchar": commonType = typeof(string); break;
                case "ntext": commonType = typeof(string); break;
                case "numeric": commonType = typeof(decimal); break;
                case "nvarchar": commonType = typeof(string); break;
                case "real": commonType = typeof(Single); break;
                case "smalldatetime": commonType = typeof(DateTime); break;
                case "smallint": commonType = typeof(short); break;
                case "smallmoney": commonType = typeof(decimal); break;
                case "sql_variant": commonType = typeof(object); break;
                case "sysname": commonType = typeof(object); break;
                case "text": commonType = typeof(string); break;
                case "time": commonType = typeof(TimeSpan); break;
                case "timestamp": commonType = typeof(byte[]); break;
                case "tinyint": commonType = typeof(byte); break;
                case "uniqueidentifier": commonType = typeof(Guid); break;
                case "varbinary": commonType = typeof(byte[]); break;
                case "varchar": commonType = typeof(string); break;
                case "xml": commonType = typeof(string); break;
                default: commonType = typeof(object); break;
            }
            return commonType;
        }
    }
#>

新建文本模板Model.tt:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="System.Data.dll" #>
<#@ assembly name="System.Data.DataSetExtensions.dll" #>
<#@ assembly name="System.Xml.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ include file="DbHelper.ttinclude"  #>
using Dapper.Contrib.Extensions;
using System;
//------------------------------------------------------------------------------
//生成时间 <#=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")#>
//------------------------------------------------------------------------------
<# 
foreach(var dbTable in DbHelper.GetDbTables(config.ConnectionString, config.DbDatabase))
{#>
/// <summary>
/// <#=dbTable.TableRemark#>
/// </summary> 
 [Table("<#= dbTable.TableName #>")]
 public  class <#= dbTable.TableName #>
{
    <# foreach(DbColumn column in DbHelper.GetDbColumns(config.ConnectionString, config.DbDatabase, dbTable.TableName)){#>
/// <summary>
    /// <#=column.Remark#>
    /// </summary> 
    <#if (column.IsPrimaryKey) { if (column.IsDefaultKey)#>[Key] <#else#>[ExplicitKey] <#}#>

    public <#= column.CSharpType#><# if(column.CommonType.IsValueType && column.IsNullable){#>?<#}#> <#=column.ColumnName#> {get;set;}
    <#}#> 
}
<#}#> 





<#+
    public class config
    {
        public static readonly string DbDatabase="dbName";
        public static readonly string ConnectionString=$"Data Source=.;Initial Catalog={DbDatabase};User ID=sa;pwd=xxx";
    }
#>

 

使用T4模板,自动生成Dapper实体类

上一篇:生于忧患而死于安乐


下一篇:linux cat命令