繁体   English   中英

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

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

我已经按照文档使用暴露为实体的联接表来建立多对多关系。

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

例如,一个Student有很多老师,而一个Teacher有很多学生。 StudentTeacher实体/表是StudentTeacher

联接表/实体:

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

联接表/实体的配置:

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(您未编写所使用的数据库引擎)中,您只能将一个设置为Cascade (另一个应为Restrict ),否则在应用迁移时会收到错误消息(在FOREIGN KEY约束_some_name_上引入了表_some_table_可能会导致循环或多个级联路径。

首先,对联接表建模似乎令人困惑,因为<= EF6不需要它。 但这实际上很简单。

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

因此,连接实体必须始终被CASCADE删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM