EF Core 3.1 Database First模式下如何将复数实体类名转为单数
EF Core 3.1 Database First 模式生成单数实体类名配置方案
方案一:使用官方推荐第三方复数化工具(操作最简单)
- 首先安装两个NuGet包,注意版本要和你使用的EF Core 3.1.2对齐:
Microsoft.EntityFrameworkCore.Design3.1.2版本Bricelam.EntityFrameworkCore.Pluralizer适配3.1的版本
- 安装完成后直接执行你原来的脚手架命令即可,无需修改命令参数:
Scaffold-DbContext "connection string" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context ApplicationDbContext - 执行完成后即可得到单数命名的实体类,同时DbContext中的DbSet属性仍保持复数形式,符合常规编码规范。
方案二:自定义复数化服务(无需依赖第三方包)
如果不想引入第三方包,可以自己实现EF Core的复数化服务接口:
- 首先在项目中添加
System.Data.Entity.Design程序集引用,然后创建自定义复数化类:
using Microsoft.EntityFrameworkCore.Design; using System.Globalization; using System.Data.Entity.Design.PluralizationServices; namespace 你的项目命名空间 { public class CustomNamePluralizer : IPluralizer { private readonly PluralizationService _service = PluralizationService.CreateService(CultureInfo.GetCultureInfo("en-US")); // 单数转复数,用于生成DbSet属性名 public string Pluralize(string name) { return _service.Pluralize(name); } // 复数转单数,用于生成实体类名 public string Singularize(string name) { return _service.Singularize(name); } } }
- 再创建设计时服务注册类,用来把你的自定义复数化器注入到EF Core脚手架服务中:
using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.DependencyInjection; namespace 你的项目命名空间 { public class ScaffoldDesignTimeService : IDesignTimeServices { public void ConfigureDesignTimeServices(IServiceCollection services) { services.AddSingleton<IPluralizer, CustomNamePluralizer>(); } } }
- 完成上述配置后,执行原来的脚手架命令,即可生成单数命名的实体类。
注意事项
- 所有EF Core相关依赖的版本必须和你使用的3.1.2版本完全一致,避免出现版本兼容导致的功能失效问题
- 执行脚手架前建议先清空之前生成的Models文件夹内容,避免旧文件和新生成的文件冲突
- 不规则英文名词(比如people、children)会按照英语语法规则自动转换,如有特殊命名需求可以在
Singularize方法中添加自定义判断逻辑
内容的提问来源于stack exchange,提问作者Emilly
相关产品推荐
相关产品推荐

