EF Core 不直接使用 T4 模板,而是通过 Scaffold-DbContext 和 Roslyn 驱动的自定义脚手架模板(如 EntityType.t4)生成代码;T4 仅作为辅助工具用于二次扩展,如生成 partial 类、DTO 或业务方法,需手动运行且依赖已编译程序集。

EF Core 本身不直接使用 T4 模板做代码生成(这是 EF6 的传统方式),而是通过 反向工程(Scaffold-DbContext) + 自定义脚手架模板 实现定制化代码生成。不过,你仍可结合 T4 做二次生成(比如基于已生成的实体再扩展类、DTO 或 BLL 层),只是原生流程已转向 CLI 和 Roslyn 驱动的模板系统。
用 .NET CLI 添加并修改默认脚手架模板
EF Core 提供了官方支持的自定义模板机制,无需手动配置 T4:
- 在项目根目录运行:
dotnet new ef-templates,会生成EFCore/文件夹,含DbContext.t4和EntityType.t4 - 这两个 .t4 文件不是给 Visual Studio 编译用的,而是由 EF Core 脚手架引擎读取并执行——所以后缀用
.t4而非.tt,避免 VS 自动处理 - 修改
EntityType.t4可控制每个实体类的字段、属性、注释、数据注解(如[Required])、甚至添加 partial 方法或接口实现 - 模板中可用
$"EntityName"、$"PropertyName"、$"ColumnType"等上下文变量,语法类似 Razor,但基于 Roslyn 编译器
基于已有实体用 T4 补充扩展类(推荐场景)
如果你已用 scaffold-dbcontext 生成了实体,想为每个实体自动加一个同名的 partial class 扩展文件(比如加计算属性、业务方法、JSON 序列化逻辑),这时 T4 就很实用:
- 新建
EntityExtensions.tt,引用项目中的 Models 程序集: - 用反射获取所有 public class:
t.IsClass && !t.IsAbstract); #> - 对每个 type 生成
public partial class [Name] { ... },比如加FullName计算属性或MapToDto()方法 - 输出路径设为
,保存后自动生成对应 .cs 文件,且与实体类同命名空间、同名,编译时自动合并
注意事项和常见踩坑点
T4 在 EF Core 场景下是“辅助工具”,不是主干流程,要注意边界:
- VS 不再内置支持 EF Core 的 .tt 模板自动运行;若坚持用 .tt,需手动右键“运行自定义工具”,且要确保目标程序集已编译完成(否则反射失败)
- EF Core 8+ 默认使用 C# Source Generators 替代部分 T4 场景(如
[Key]自动生成),T4 更适合结构固定、跨层批量生成的场景(如统一加 IValidatableObject、加审计字段封装) - 数据库表名含大小写、特殊字符时,T4 中需调用
SanitizeIdentifier()(EF Core 内部有该方法,可在自定义模板中复用逻辑)避免生成非法类名 - 若用 MySQL 或 PostgreSQL,注意信息模式(information_schema)查询权限,T4 中连接数据库读表结构时,需显式开权限或改用已生成的模型反射替代
基本上就这些。EF Core 的自定义重点在脚手架模板,T4 是灵活补位;选对时机比强行套用更重要。

















