Scaffold-DbContext逆向工程:自定义模型与列名需求问询
Scaffold-DbContext自定义表/列名:支持情况与替代方案
直接说结论:目前原生的Scaffold-DbContext并不支持逐个指定自定义表名或列名,官方也没有公开的近期计划添加这个特性。不过针对你的需求(避免手动修改后被逆向工程覆盖),有几个实用的替代方案可以解决问题。
先明确现状
你提到的两种命名选项确实是目前Scaffold-DbContext仅有的选择:
- 加
-UseDatabaseNames:完全照搬数据库里的原名称(比如tableA) - 不加该参数:自动转成符合C# PascalCase的命名(比如
TableA) - 手动修改模型名/列名后,再次执行逆向工程会被覆盖,这在大型遗留数据库项目里确实是个痛点,完全理解你的困扰。
推荐的替代方案
1. EF Core Power Tools(首推)
这是一个免费的Visual Studio扩展,在原生EF Core脚手架的基础上做了大幅增强:
- 逆向工程前可以可视化地逐个设置表的自定义实体名称,还能给列指定自定义属性名
- 可以保存你的自定义映射配置,后续数据库更新(比如加新表)时,重新生成模型会自动保留这些自定义设置,不用重复修改
- 还支持很多其他实用功能,比如筛选要生成的实体、配置导航属性、生成DTO等
2. 自定义EF Core脚手架模板
如果你喜欢用命令行,可以自己定制脚手架模板:
- 先导出默认的EF Core模板:执行
dotnet new install Microsoft.EntityFrameworkCore.Templates,然后把模板导出到本地目录 - 修改模板中的命名逻辑,比如加入一个配置文件(比如JSON)来存储表名→实体名、列名→属性名的映射关系
- 之后用自定义模板执行逆向工程:
dotnet ef dbcontext scaffold "{connection_string}" Microsoft.EntityFrameworkCore.SqlServer -TemplatePath ./YourCustomTemplates
这种方式适合有一定模板开发经验的用户,灵活性最高。
3. 手动数据注解映射(仅适合小型项目)
如果项目规模不大,可以先用默认命令生成模型,再通过[Table]和[Column]数据注解手动指定自定义名称:
[Table("CustomTableA")] public class CustomTableA { [Column("CustomColumnId")] public int Id { get; set; } }
但要注意,每次重新执行逆向工程都会覆盖这些手动修改,需要重复操作,所以只适合小型、数据库变动少的项目。
关于官方支持
你可以在EF Core的GitHub仓库提交功能请求,社区的需求经常会被官方考虑,但目前没有明确的时间表说会添加这个特性。
内容的提问来源于stack exchange,提问作者Ish Thomas




