新建EDMX无法对含下划线的表名执行单数化转换问题求助
解决EDMX表名含下划线时单数化失效问题
问题原因
EF 内置的默认单数化服务会将下划线识别为命名分隔断点,仅处理下划线前的字符段复数规则,不会识别下划线后的片段的复数形式,所以会出现下划线表名单数化失效问题。
解决方案
方案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); } }
- 修改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
相关产品推荐
相关产品推荐

