如何让EF Core脚手架复数化更“直白”?避免Person生成People
EF Core脚手架生成DbSet命名问题
我现有一个数据库,使用如下命令进行EF Core脚手架生成:
dotnet ef dbcontext scaffold "Data Source=xxx;Initial Catalog=xxx;User ID=xxx;Password=xxx;Trust Server Certificate=True" Microsoft.EntityFrameworkCore.SqlServer --use-database-names --context DatabaseContext --context-dir DataGenerated --output-dir ModelsGenerated --no-onconfiguring --force
数据库包含Car、Dog、Person三张表,生成后得到:
public virtual DbSet<Car> Cars { get; set; }- 符合预期public virtual DbSet<Dog> Dogs { get; set; }- 符合预期public virtual DbSet<Person> People { get; set; }- 不符合预期,希望得到Persons而非People
请问是否有参数或开关可以解决此问题,无需深入修改模板或手动调整?
解决方案
EF Core的dotnet ef dbcontext scaffold命令目前没有单独控制单个DbSet复数命名的参数,但有两种无需修改模板或手动调整的全局方式解决:
添加
--no-pluralize开关
你当前使用的--use-database-names仅控制实体类名沿用表名,但DbSet命名仍会走EF Core内置的英文复数化规则(比如Person被转为People)。添加--no-pluralize后,DbSet会直接采用实体类名加s的简单复数形式,刚好能让Person对应Persons,同时Car、Dog对应的DbSet仍保持Cars、Dogs,完全符合你的需求。修改后的命令:
dotnet ef dbcontext scaffold "Data Source=xxx;Initial Catalog=xxx;User ID=xxx;Password=xxx;Trust Server Certificate=True" Microsoft.EntityFrameworkCore.SqlServer --use-database-names --context DatabaseContext --context-dir DataGenerated --output-dir ModelsGenerated --no-onconfiguring --force --no-pluralize调整数据库表名(若允许)
如果数据库结构可以修改,将Person表改名为Persons,结合--use-database-names参数,EF Core会自动生成public virtual DbSet<Person> Persons { get; set; }。这种方式适合允许调整数据库的场景。
如果仅需针对单个实体调整DbSet命名且不想全局禁用复数化,才需要修改脚手架模板或手动调整代码,但就你的需求而言,--no-pluralize是最直接的解决方案。
内容的提问来源于stack exchange,提问作者AppleMoose
相关产品推荐
相关产品推荐

