.NET 6/7升级后EF Core脚手架不生成代理表的命令级方案咨询
EF Core 6/7数据库优先脚手架不生成复合主键连接表的解决方法
我定义了如下SQL连接表:
CREATE TABLE [dbo].[Blah] ( [FooID] INT NOT NULL, [ClientID] INT NOT NULL, CONSTRAINT [PK_Blah] PRIMARY KEY CLUSTERED ([FooID] ASC, [ClientID] ASC), CONSTRAINT [FK_Blah_Foo] FOREIGN KEY ([FooID]) REFERENCES [dbo].[Foo] ([FooID]) ON DELETE CASCADE, CONSTRAINT [FK_Blah_Client] FOREIGN KEY ([ClientID]) REFERENCES [dbo].[Client] ([ClientID]) ON DELETE CASCADE );
从.NET Core 3升级到.NET 6/7后,EF Core的数据库优先脚手架工具不再自动生成这类仅包含复合外键主键的连接表实体。我尝试过两种方案:
- 使用
Scaffold-DbContext的-Tables参数指定该表,但需要手动列出所有表,通用性差:Scaffold-DbContext "..." Microsoft.EntityFrameworkCore.SqlServer -OutputDir Entities -ContextDir . -DataAnnotations -UseDatabaseNames -Context AuthorisationContext -Force -NoOnConfiguring -NoPluralize -Tables Blah - 先生成该表的实体类,还原DbContext的自动修改后,手动将
DbSet<Blah>添加到自定义的分部DbContext中:public partial class MyDbContext : DbContext { public virtual DbSet<Blah> Blah { get; set; } //... }
更优解决方案:使用-NoManyToMany参数
EF Core 6及以上版本的脚手架默认会把这种仅包含两个外键且构成复合主键的表识别为多对多关系的隐式连接表,不会单独生成实体,而是直接在Foo和Client实体间生成多对多导航属性。如果要强制生成该连接表的独立实体,只需在脚手架命令中添加-NoManyToMany参数即可。
修改后的完整命令:
Scaffold-DbContext "..." Microsoft.EntityFrameworkCore.SqlServer -OutputDir Entities -ContextDir . -DataAnnotations -UseDatabaseNames -Context AuthorisationContext -Force -NoOnConfiguring -NoPluralize -NoManyToMany
该参数会禁用自动识别多对多关系的逻辑,所有符合条件的连接表都会被生成为独立实体,无需手动指定单个表或后续修改DbContext。
内容的提问来源于stack exchange,提问作者Marcin Piwowarski
相关产品推荐
相关产品推荐

