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

运行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:24:21