使用Scaffold-DbContext时如何将数据库架构名添加到C#实体类名称中?
Scaffold-DbContext时如何将数据库架构名添加到C#实体类名称中?
我太懂你这种混乱的感受了!当不同数据库架构下存在同名表时,比如你遇到的[marketing].[ClientsGroups]和[sales].[ClientsGroups],默认用Scaffold-DbContext生成实体类时,只会给重复的类名加上数字后缀(像ClientsGroups1.cs这样),确实很容易搞混。下面给你几个实用的解决办法:
直接用EF Core内置参数(推荐,EF Core 5及以上版本适用)
EF Core 5开始提供了-UseDatabaseNames参数,它会自动把数据库架构名作为实体类名的前缀,生成的类名会变成MarketingClientsGroups和SalesClientsGroups,清晰又直观。
示例命令:Scaffold-DbContext "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer -UseDatabaseNames -OutputDir Models用反向工程配置文件自定义(EF Core 6及以上版本适用)
如果需要更灵活的配置,可以创建一个ReverseEngineeringSettings.json文件放在项目根目录,内容如下:{ "CodeGenerationOptions": { "UseDatabaseNames": true } }之后再运行
Scaffold-DbContext命令,工具会自动读取这个配置,生成带架构前缀的实体类。手动修改实体类与映射关系(兼容所有版本)
要是你用的是较旧的EF Core版本,没有上面的参数,那就只能生成后手动调整:- 把
ClientsGroups1.cs重命名为SalesClientsGroups.cs,原ClientsGroups.cs重命名为MarketingClientsGroups.cs - 打开生成的DbContext类,修改对应的DbSet名称和表映射:
public DbSet<MarketingClientsGroups> MarketingClientsGroups { get; set; } public DbSet<SalesClientsGroups> SalesClientsGroups { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<MarketingClientsGroups>() .ToTable("ClientsGroups", "marketing"); modelBuilder.Entity<SalesClientsGroups>() .ToTable("ClientsGroups", "sales"); // 其他配置... }
- 把
这样处理后,你就能通过实体类名直接区分不同架构下的表,再也不会搞混啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

