使用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' order by obj.name";
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 or colm.is_identity=1 THEN 1 ELSE 0 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")#>
//------------------------------------------------------------------------------
namespace mis
{
<#
foreach(var dbTable in DbHelper.GetDbTables(config.ConnectionString, config.DbDatabase))
{#>
/// <summary>
/// <#=dbTable.TableRemark.Replace("\r\n", " ")#>
/// </summary>
[Table("<#= dbTable.TableName #>")]
public class <#= dbTable.TableName #>
{
<# foreach(DbColumn column in DbHelper.GetDbColumns(config.ConnectionString, config.DbDatabase, dbTable.TableName)){#>
/// <summary>
/// <#=column.Remark.Replace("\r\n", " ")#>
/// </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="MIS";
public static readonly string ConnectionString=$"Data Source=123.56.253.200;Initial Catalog={DbDatabase};User ID=sa;pwd=zxhd@123";
}
#>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库