运行EF Core脚手架时如何生成复数形式的实体类名?
EF Core 6 DB First 生成复数实体类名配置方法
默认EF Core脚手架的内置命名逻辑只会给DbSet属性名加复数后缀,实体类名默认会被处理为单数形式,第三方复数器包默认也是遵循「单数实体类+复数DbSet」的行业通用规范,所以直接安装后达不到你要的实体类也用复数命名的效果,按下面的步骤配置即可100%匹配需求:
步骤1:安装必要依赖
首先确保你的数据层项目(Knowfully.Delivery.Data)里所有EF Core相关包版本统一为6.0.6,包括Microsoft.EntityFrameworkCore.SqlServer、Microsoft.EntityFrameworkCore.Design,版本不匹配会导致设计时服务加载失败。
再安装单复数处理包,避免硬编码加s遇到不规则名词(如Person→People)出错:
Install-Package Pluralize.NET -ProjectName Knowfully.Delivery.Data
步骤2:添加自定义命名规则实现
在数据层项目根目录新建自定义复数器类,实现EF Core设计时提供的IPluralizer接口,重写单复数处理逻辑,让实体类名也保留复数形式:
using Microsoft.EntityFrameworkCore.Design; using Pluralize.NET; namespace Knowfully.Delivery.Data { public class CustomPluralizer : IPluralizer { private static readonly IPluralize _pluralizeService = new PluralizeService(); // DbSet属性名返回复数形式 public string Pluralize(string identifier) => _pluralizeService.Pluralize(identifier); // 实体类名不做单数化处理,同样返回复数形式 public string Singularize(string identifier) => _pluralizeService.Pluralize(identifier); } }
EF Core脚手架启动时会自动扫描项目内的IPluralizer实现,优先用自定义实现替代默认逻辑,不需要额外注册配置。
步骤3:执行脚手架命令
直接执行你原来的Scaffold命令即可,注意不要加-NoPluralize参数,否则自定义复数器不会生效:
Scaffold-DbContext -Project "Knowfully.Delivery.Data" -StartupProject "Knowfully.Delivery.Data" "Server=.;Database=delivery-db;Trusted_Connection=True;Integrated Security=true;MultipleActiveResultSets=true;" Microsoft.EntityFrameworkCore.SqlServer -Context DeliveryDbContext -ContextDir . -OutputDir Entities -Force
常见问题排查
- 如果生成的类名还是单数:先检查项目里有没有安装其他第三方复数器包,多实现冲突会导致自定义逻辑不加载,卸载掉多余的包重新执行即可。
- 如果提示找不到IPluralizer接口:检查
Microsoft.EntityFrameworkCore.Design包是否安装、版本是否和其他EF Core包完全一致。 - 如果不需要处理不规则复数,只想给类名硬加
s后缀,可以直接把上面接口实现里的逻辑替换为直接返回identifier + "s",不需要安装Pluralize.NET包。
内容的提问来源于stack exchange,提问作者Mauro Bilotti
相关产品推荐
相关产品推荐

