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,替代默认生成的RightsIdOnDelete(DeleteBehavior.NoAction)覆盖默认的级联删除行为,设置为无操作- 若仅需修改单侧删除行为,调整对应
HasOne块中的OnDelete即可
生成迁移命令:
- Package Manager Console:
Add-Migration UpdateLeftRightRelationship
- .NET CLI:
dotnet ef migrations add UpdateLeftRightRelationship
内容的提问来源于stack exchange,提问作者Luiz Bicalho
相关产品推荐
相关产品推荐

