如何在 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? ...*/);
您应该在此处指定当父记录(在Student
或Teacher
中)被删除时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
删除加入实体。
我 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? ...*/);
您应该在此处指定当父记录(在Student
或Teacher
中)被删除时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
删除加入实体。