如何在 EF Core 多对多关系中对删除进行建模?

How do I model deletion in an EF Core many-to-many relationship?

followed the docs 设置了我的多对多关系,使用作为实体公开的连接 table。

但是文档没有提到我应该如何删除。

例如,Student 有很多老师,Teacher 有很多学生。联接 entity/table 是 StudentTeacher

加入table/entity:

public class StudentTeacher {
  public int StudentId { get; set; }
  public Student Student { get; set; }
  public int TeacherId { get; set; }
  public Teacher Teacher { get; set; }
}

连接的配置 table/entity:

modelBuilder.Entity<StudentTeacher>()
  .HasOne(b => b.Teacher)
  .WithMany(b => b.StudentTeachers)
  .HasForeignKey(b => b.TeacherId)
  .IsRequired()
  .OnDelete(/* ... what goes here? ...*/);

modelBuilder.Entity<StudentTeacher>()
  .HasOne(b => b.Student)
  .WithMany(b => b.StudentTeachers)
  .HasForeignKey(b => b.StudentId)
  .IsRequired()
  .OnDelete(/* ... what goes here? ...*/);

我在 OnDelete() 中使用什么?为什么?

.OnDelete(/* ... what goes here? ...*/);

您应该在此处指定当父记录(在StudentTeacher中)被删除时DB必须对子记录(在StudentTeacher中)做什么:也删除(Cascade) 或禁止并抛出错误 (Restrict) 如果相应的子记录存在。对于 Restrict,您必须在删除父记录之前手动删除子记录。

但只有您可以决定必须为每个关系应用什么操作 - 这是您的应用程序,我们不知道它的所有要求。

重要:对于Cascade,删除,比方说,Teacher只会影响(删除)StudentTeacher中的记录(对应TeacherId), 但 Students 将保持不变。

重要2:在MS SQL Server中(你没有写你用的是什么DB引擎),你可以只设置一个到Cascade(其他应该是Restrict),否则你会在应用迁移时收到错误消息(Introducing FOREIGN KEY constraint _some_name_ on table _some_table_ may cause cycles or多个级联路径。)

起初似乎对连接建模感到困惑 table,因为 <=EF6 不需要它。但其实很简单。

删除Teacher个实体时,您需要删除它与所有Student个实体的关系。删除 Student 个实体时,您需要删除它与所有 Teacher 个实体的关系。

因此必须始终 CASCADE 删除加入实体。