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

新建EDMX无法对含下划线的表名执行单数化转换问题求助

解决EDMX表名含下划线时单数化失效问题

问题原因

EF 内置的默认单数化服务会将下划线识别为命名分隔断点,仅处理下划线前的字符段复数规则,不会识别下划线后的片段的复数形式,所以会出现下划线表名单数化失效问题。

解决方案

方案1:自定义单数化服务(永久生效,更新模型无需重复调整)

  1. 首先在项目中实现自定义单数化类,继承IPluralizationService接口:
using System.Data.Entity.Design.PluralizationServices;
using System.Globalization;

public class UnderlineCompatiblePluralizationService : IPluralizationService
{
    private readonly PluralizationService _defaultService = PluralizationService.CreateService(CultureInfo.GetCultureInfo("en-us"));

    // 复数化方法
    public string Pluralize(string word)
    {
        if (word.Contains("_"))
        {
            var segments = word.Split('_');
            segments[^1] = _defaultService.Pluralize(segments[^1]);
            return string.Join("_", segments);
        }
        return _defaultService.Pluralize(word);
    }

    // 单数化方法
    public string Singularize(string word)
    {
        if (word.Contains("_"))
        {
            var segments = word.Split('_');
            // 仅对下划线最后一段内容做单数化转换,前面前缀保留
            segments[^1] = _defaultService.Singularize(segments[^1]);
            return string.Join("_", segments);
        }
        return _defaultService.Singularize(word);
    }
}
  1. 修改EDMX对应的T4模板文件:
  • 找到EDMX文件同级下的[你的模型名称].tt和[你的模型名称].Context.tt两个模板文件
  • 打开模板,搜索PluralizationService,将默认的服务创建代码替换为自定义服务实例:
// 注释掉原来的默认服务创建代码
// IPluralizationService pluralizationService = PluralizationService.CreateService(CultureInfo.GetCultureInfo("en-us"));
// 替换为自定义服务
IPluralizationService pluralizationService = new UnderlineCompatiblePluralizationService();

修改保存后重新运行模板生成代码,DF_DeletedVariables就会自动转换为你需要的DF_DeletedVariable。

方案2:手动修改(适合表数量少的临时场景)

直接在EDMX设计器中选中生成的错误实体名,右键重命名为你需要的单数形式即可,注意每次从数据库更新模型时不要勾选覆盖实体名称的选项。

内容的提问来源于stack exchange,提问作者KaleemParacha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:45:02