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

EF Core 7.0多对多关系默认配置修改方法咨询

正确的EF Core多对多关系配置(无中间类)

假设你的实体模型结构如下:

public class Left
{
    public int Id { get; set; }
    public ICollection<Right> Rights { get; set; } = new List<Right>();
}

public class Right
{
    public int Id { get; set; }
    public ICollection<Left> Lefts { get; set; } = new List<Left>();
}

在OnModelCreating中通过UsingEntity方法可以完全自定义自动生成的关联表,包括列名、删除行为:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Left>()
        .HasMany(left => left.Rights)
        .WithMany(right => right.Lefts)
        .UsingEntity<Dictionary<string, object>>(
            "LeftRight", // 指定关联表名
            j => j
                .HasOne<Right>()
                .WithMany()
                .HasForeignKey("RightId") // 将默认的RightsId改为RightId
                .OnDelete(DeleteBehavior.NoAction) // 设置删除行为为NoAction
                .HasConstraintName("FK_LeftRight_Rights_RightId"),
            j => j
                .HasOne<Left>()
                .WithMany()
                .HasForeignKey("LeftId")
                .OnDelete(DeleteBehavior.NoAction) // 若需修改Left侧的删除行为,同样设置NoAction
                .HasConstraintName("FK_LeftRight_Lefts_LeftId"),
            j =>
            {
                j.HasKey("LeftId", "RightId"); // 配置关联表的复合主键
            });
}

关键说明:

  • 无中间类的多对多关系必须通过UsingEntity访问关联表的配置项,直接在HasMany/WithMany后配置外键会报错
  • Dictionary<string, object>是EF Core自动生成中间表的默认载体,无需自定义实体类
  • HasForeignKey("RightId")明确指定关联表中对应Right实体的外键列名为RightId,替代默认生成的RightsId
  • OnDelete(DeleteBehavior.NoAction)覆盖默认的级联删除行为,设置为无操作
  • 若仅需修改单侧删除行为,调整对应HasOne块中的OnDelete即可

生成迁移命令:

  • Package Manager Console:
Add-Migration UpdateLeftRightRelationship
  • .NET CLI:
dotnet ef migrations add UpdateLeftRightRelationship

内容的提问来源于stack exchange,提问作者Luiz Bicalho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:45:38