Entity Framework Core DBContext脚手架生成Oracle数据模型的命名规范问题
解决EF Core数据库优先生成PascalCase命名模型的问题
我之前也遇到过类似的困扰,Oracle.EntityFrameworkCore的脚手架工具默认会把数据库里的全大写表名/列名转换成「首字母大写、其余小写」的格式,没法直接生成符合PascalCase规范的类和属性。下面分享几个可行的解决办法:
方案1:自定义脚手架命名服务(推荐,从根源解决)
这个方法能让你在生成模型的阶段就直接得到PascalCase格式的类和属性,不用事后修改。
步骤1:添加设计时服务类
在你的Web API项目里新建一个类文件,比如DesignTimeServices.cs,实现EF Core的设计时服务和自定义命名规则:
using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore.Scaffolding; using System.Globalization; using System.Linq; public class PascalCaseNamingService : INamingService { // 转换为驼峰命名(这里我们统一用PascalCase,所以直接复用转换逻辑) public string ConvertToCamelCase(string name) => ToPascalCase(name); // 转换为类名 public string ConvertToClassName(string name) => ToPascalCase(name); // 转换为属性名 public string ConvertToPropertyName(string name) => ToPascalCase(name); // 核心转换逻辑:处理下划线分隔的命名,转成PascalCase private string ToPascalCase(string input) { if (string.IsNullOrWhiteSpace(input)) return input; // 先把全大写的输入转小写,再按下划线拆分单词 var wordParts = input.ToLower(CultureInfo.InvariantCulture).Split('_'); // 每个单词首字母大写,然后拼接 return string.Concat(wordParts.Select(part => char.ToUpper(part[0], CultureInfo.InvariantCulture) + part.Substring(1))); } } public class CustomDesignTimeServices : IDesignTimeServices { // 注册自定义命名服务 public void ConfigureDesignTimeServices(IServiceCollection services) { services.AddSingleton<INamingService, PascalCaseNamingService>(); } }
步骤2:重新执行脚手架命令
保持你原来的脚手架命令不变,直接重新执行:
dotnet ef dbcontext scaffold "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=SKL)));User Id=BOR;Password=myPassword;" Oracle.EntityFrameworkCore -o Models\BOR -c "EF_BORContext" -f --no-onconfiguring
这次生成的类和属性就会严格遵循PascalCase规范了——比如数据库里的APPGROUP表会生成Appgroup类,USER_NAME列会生成UserName属性。
方案2:生成后批量重构(快速临时方案)
如果你不想写自定义代码,可以用IDE的批量重构功能快速修正命名:
- Visual Studio:选中
Models\BOR文件夹,右键选择「重构」→「重命名」,在弹出的窗口里选择「大小写转换」→「PascalCase」,一键修改所有类和属性的命名。 - Rider/ReSharper:使用「查找替换」功能,配合正则表达式匹配首字母大写其余小写的命名,替换成PascalCase格式(比如匹配
(\w)(\w+),替换为$1${2.ToTitleCase()})。
方案3:DbContext映射配置(仅调整映射关系)
这个方法不会改变生成的类和属性名称,只是修改EF Core和数据库之间的映射规则,让PascalCase的类/属性对应数据库的全大写命名:
在EF_BORContext的OnModelCreating方法里添加以下代码:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 遍历所有实体和属性,设置映射的表名/列名 foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { // 将类名转成全大写,映射到数据库表 entityType.SetTableName(entityType.ClrType.Name.ToUpper()); foreach (var property in entityType.GetProperties()) { // 将属性名转成全大写,映射到数据库列 property.SetColumnName(property.Name.ToUpper()); } } // 保留原来的脚手架生成的配置代码 base.OnModelCreating(modelBuilder); }
这个方案适合已经生成模型后,不想重新生成但需要调整映射的场景。
内容的提问来源于stack exchange,提问作者Arsman Ahmad
相关产品推荐
相关产品推荐

