如何在EF Core Scaffold-DbContext中强制自定义复数化规则
解决方案
方案1:自定义EF Core复数化服务(推荐,全自动化实现需求)
EF Core 5及以上版本支持自定义IPluralizer接口替换默认复数化逻辑,可完全适配你的特殊命名规则:
- 第一步:提前安装NuGet包
Humanizer.Core,用于复用默认的单复数转换逻辑 - 第二步:创建自定义复数化类,实现
IPluralizer接口
using Microsoft.EntityFrameworkCore.Design; using System.Collections.Generic; using Humanizer; public class CustomPluralizer : IPluralizer { // 配置特殊名词的单复数映射 private readonly Dictionary<string, string> _singularToPlural = new() { {"SaleOrderPos", "SaleOrderPoses" }, // 其他以s结尾的特殊表名可直接在此处批量添加规则 }; private readonly Dictionary<string, string> _pluralToSingular = new() { {"SaleOrderPos", "SaleOrderPos" }, // 保留原始表名作为实体类名 // 其他特殊规则同步在此处添加 }; public string Pluralize(string name) { if (_singularToPlural.TryGetValue(name, out var plural)) return plural; return name.Pluralize(inputIsKnownToBeSingular: false); } public string Singularize(string name) { if (_pluralToSingular.TryGetValue(name, out var singular)) return singular; return name.Singularize(inputIsKnownToBePlural: false); } }
- 第三步:创建自定义设计时服务工厂,让脚手架加载自定义复数化器
using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.DependencyInjection; public class CustomScaffoldingDesignTimeServices : IDesignTimeServices { public void ConfigureDesignTimeServices(IServiceCollection services) { services.AddSingleton<IPluralizer, CustomPluralizer>(); } }
注:以上两个自定义类需要放在执行Scaffold命令的项目根目录下,脚手架会自动扫描加载
- 第四步:运行脚手架命令时去掉
-NoPluralize参数,正常执行即可:Scaffold-DbContext "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
最终生成的代码会完全符合需求:
- 实体类名保留为
SaleOrderPos - DbSet属性为
public virtual DbSet<SaleOrderPos> SaleOrderPoses { get; set; } - 自动保留原表名的映射关联,不会影响数据库操作
方案2:轻量适配(仅少量特殊表时使用)
如果只有个别特殊命名的表,可以先加-NoPluralize参数生成代码后,手动修改DbContext中的DbSet属性名即可,不需要改动实体类的表映射特性,不会影响数据库关联。
内容的提问来源于stack exchange,提问作者Patxistein
相关产品推荐
相关产品推荐

