如何让EF6数据库优先迁移生成遵循C#帕斯卡命名约定的类?
当然可以实现!
数据库优先模式下,Entity Framework 6完全支持让生成的实体类和属性遵循C#的帕斯卡命名法(PascalCase),我给你两个最实用的方案:
方案一:修改TT模板实现自动命名转换(推荐)
EF6数据库优先生成代码时,默认使用TT(T4)模板来生成类和属性。我们可以修改模板里的命名逻辑,让它自动把数据库的下划线/小写命名转换成帕斯卡命名:
- 打开你的EDMX文件,右键空白区域,选择添加代码生成项
- 在弹出的对话框里,切换到「数据」分类,选择EF 6.x DbContext Generator(如果没找到这个选项,先安装NuGet包
EntityFramework.CodeTemplates.CSharp) - 添加后,项目里会多出两个
.tt文件:[你的模型名].Context.tt和[你的模型名].tt - 打开
[你的模型名].tt文件,做以下修改:- 首先在模板开头添加一个自定义的命名转换函数:
string ToPascalCase(string input) { if (string.IsNullOrWhiteSpace(input)) return input; // 处理下划线分隔的命名,比如user_info → UserInfo var parts = input.Split(new[] {'_', ' '}, StringSplitOptions.RemoveEmptyEntries); return string.Concat(parts.Select(part => char.ToUpper(part[0]) + part.Substring(1).ToLower())); } - 找到生成实体类名的代码行(大概在
foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))循环里),把原来的<#=code.Escape(entity)#>替换成<#=ToPascalCase(code.Escape(entity))#> - 再找到生成属性名的代码行(在
foreach (var edmProperty in entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity))循环里),把<#=code.Escape(edmProperty)#>替换成<#=ToPascalCase(code.Escape(edmProperty))#>
- 首先在模板开头添加一个自定义的命名转换函数:
- 保存模板后,EF会自动重新生成代码,这时你会看到所有类和属性都变成了帕斯卡命名格式!
这个方案的好处是一劳永逸——以后每次从数据库更新模型,代码都会自动按帕斯卡命名生成,不用手动修改。
方案二:手动修改EDMX中的实体/属性名称(适合小项目)
如果你的项目规模不大,也可以直接在EDMX设计器里修改实体和属性的名称:
- 打开EDMX设计器,选中要修改的实体(比如数据库表
user_info生成的实体),在属性窗口里把「名称」改成UserInfo - 选中每个属性(比如
user_id),在属性窗口里把「名称」改成UserId - 修改完成后,右键EDMX文件选择「生成数据库上下文」,生成的代码就会用你修改后的帕斯卡命名了
不过这个方案的缺点是,每次从数据库更新模型时,修改的名称会被覆盖,需要重新调整,所以只适合模型很少变动的项目。
内容的提问来源于stack exchange,提问作者user5986440
相关产品推荐
相关产品推荐

