You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:33:20