用 Dapper 配合 T4 模板生成实体类,核心是利用数据库元数据(如
INFORMATION_SCHEMA或系统视图)+ T4 的文本生成能力,自动生成与表结构一一对应的 C# 实体类。它不依赖第三方 ORM 代码生成器,轻量、可控、可定制。
准备数据库连接和元数据查询
在 T4 模板中需要能访问数据库,获取表名、列名、数据类型、是否为空、主键等信息。推荐用 SQL Server 的
sys.tables和
sys.columns查询(其他数据库类似): 用
SqlConnection连接数据库(T4 中支持
System.Data.SqlClient或
Microsoft.Data.SqlClient) 执行类似下面的 SQL 获取字段信息(含类型映射、是否主键、是否自增等): SELECT t.name AS TableName, c.name AS ColumnName, ty.name AS SqlType, c.max_length, c.precision, c.scale, c.is_nullable, c.is_identity, ISNULL(pk.is_primary_key, 0) AS IsPrimaryKey FROM sys.tables t INNER JOIN sys.columns c ON t.object_id = c.object_id INNER JOIN sys.types ty ON c.user_type_id = ty.user_type_id LEFT JOIN (SELECT object_id, column_id, 1 as is_primary_key FROM sys.index_columns ic INNER JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id WHERE i.is_primary_key = 1) pk ON c.object_id = pk.object_id AND c.column_id = pk.column_id WHERE t.is_ms_shipped = 0 ORDER BY t.name, c.column_id
编写基础 T4 模板(.tt 文件)
新建一个
Models.tt文件,顶部添加连接字符串和引用: 定义连接字符串(建议从配置文件读取或硬编码测试用)
模板主体遍历表 → 遍历字段 → 生成属性,注意处理 SQL 类型到 C# 类型的映射(如
int,
string,
DateTime?,
bool?),并加
[Column]或
[Key]等 Dapper 常用特性(需引入
Dapper命名空间)。
类型映射与特性标注(关键细节)
SQL Server 类型转 C# 类型不能只看名字,要结合精度、长度、空值判断:
varchar(n)/nvarchar(n)→
string(n ≤ 4000 通常不加
[StringLength];若需校验可按需加)
bit→
bool?(因可能为 NULL)或
bool(配合
ISNULL(col,0)查询时)
datetime/datetime2→
DateTime?
int/bigint→
int?/long?(主键且
is_identity=1可标
[Key]+
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]) 所有字段加
[Column("ColumnName")],确保 Dapper 映射时不依赖命名约定
生成后自动保存为 .cs 文件(可选增强)
T4 默认输出到一个文件,但通常希望每张表一个实体类。可用
配合循环内多次调用this.GenerationEnvironment并写入不同文件(需启用
hostspecific="true"): 用
File.WriteAllText(Host.ResolvePath($"{tableName}.cs"), content); 单独保存(需添加 )
注意:VS 中 T4 不支持直接写多文件,需配合自定义生成逻辑或改用 MSBuild + TextTransform 工具
更稳的方式:生成一个包含所有实体的 Models.generated.cs,再手动拆分或用脚本后处理
基本上就这些。T4 + Dapper 实体生成不复杂但容易忽略类型空值判断和主键识别逻辑,跑通一次后可封装成公司内部模板,配合 CI 自动更新实体。
