如何关闭EF Core Database-First脚手架将PostgreSQL表名自动翻译为德语的行为?
解决EF Core Scaffold自动翻译表名的问题
这个问题是EF Core脚手架工具默认启用了单复数转换,而你的系统区域性是德语,所以工具把masterdata识别成德语名词的复数形式,自动转成了单数Masterdatum。要关闭这个行为,最直接的方法是在scaffold命令中添加参数禁用复数化:
方法1:在命令中添加--no-pluralize参数
修改你的脚手架命令,加上--no-pluralize选项,这样就会完全关闭自动单复数转换,表名将直接按照帕斯卡命名规则生成(首字母大写,其余保持原表名的拼写):
dotnet ef dbcontext scaffold "Host=xxx;Database=xxx;Username=xxx;Password=xxx" Npgsql.EntityFrameworkCore.PostgreSQL -o Models -f --no-pluralize
执行这个命令后,生成的实体类会是Masterdata,对应的Fluent API配置也会是modelBuilder.Entity<Masterdata>(entity => { entity.ToTable("masterdata"); ...,和你的表名完全对应。
方法2:自定义复数化逻辑(进阶)
如果需要更灵活的控制,而不是完全禁用,你可以实现自定义的IPluralizer接口,让EF Core按照你想要的规则处理表名:
- 在你的项目中添加一个类,实现
Microsoft.EntityFrameworkCore.Design.IPluralizer接口:
using Microsoft.EntityFrameworkCore.Design; public class NoopPluralizer : IPluralizer { // 单数转复数:直接返回原名称 public string Pluralize(string name) => name; // 复数转单数:直接返回原名称 public string Singularize(string name) => name; }
- 在项目的
DesignTimeDbContextFactory或者通过设计时服务注册这个自定义实现(如果没有工厂类,需要先创建)。不过这个方法比直接加参数繁琐,所以更推荐第一种方案。
为什么会出现这个问题?
EF Core的脚手架工具默认会根据当前系统的CultureInfo(你的系统是德语)来执行名词的单复数转换。对于masterdata这个表名,工具可能将其识别为德语中Masterdatum的复数形式(德语中Datum的复数是Daten,工具可能做了近似匹配),因此自动转换为单数形式的实体类名称。关闭复数化后,工具就不会做这个转换了。
内容的提问来源于stack exchange,提问作者MrLight
相关产品推荐
相关产品推荐

