You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:42:31