.NET Core 3.1多DbContext scaffolding同名表避免覆盖及别名咨询
我之前处理过类似的场景,EF Core的脚手架工具其实提供了两种很实用的方式来解决这个同名实体覆盖的问题,而且确实支持别名设置,下面给你详细说明:
方案1:为每个DbContext的实体分配独立的文件夹/命名空间
这是最直观的解决思路——让两个DbContext的实体文件存放在不同的目录下,从根本上避免文件覆盖。
生成dbContext1时,指定专属的输出目录:
Scaffold-DbContext "Server=ipaddress;Database=Database1;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Data/DbContext1 -Tables "Job","General" -Context dbContext1
生成dbContext2时,换一个输出目录:
Scaffold-DbContext "Server=ipaddress;Database=Database2;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Data/DbContext2 -Tables "Job","General" -Context dbContext2
如果需要更严谨的区分,还可以加上-Namespace参数为每个目录下的实体指定独立的命名空间:
Scaffold-DbContext "Server=ipaddress;Database=Database1;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Data/DbContext1 -Tables "Job","General" -Context dbContext1 -Namespace YourApp.Data.DbContext1
这样后续在项目中引用时,通过命名空间就能清晰区分来自不同数据库的实体。
方案2:为同名表生成带别名的实体类
如果你希望实体文件都放在同一目录下,EF Core支持直接为生成的实体类设置别名——只需要在指定表名时用TableName(EntityAlias)的格式即可。
生成dbContext1时,给实体设置专属别名:
Scaffold-DbContext "Server=ipaddress;Database=Database1;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Data -Tables "Job(JobDb1)","General(GeneralDb1)" -Context dbContext1
生成dbContext2时用不同的别名:
Scaffold-DbContext "Server=ipaddress;Database=Database2;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Data -Tables "Job(JobDb2)","General(GeneralDb2)" -Context dbContext2
这样生成的实体类会以你指定的别名命名(比如JobDb1、JobDb2),完全不会出现覆盖问题。
关于你问的别名设置支持:当然支持!上面的方案2就是官方提供的实体别名设置方式,EF Core 2.1及以上版本(包括你使用的3.1)都可以正常使用这个语法。
内容的提问来源于stack exchange,提问作者user2370664
相关产品推荐
相关产品推荐

