我按照文档设置了我的多对多关系,使用作为实体公开的联接表。
但是文档没有提到我应该如何处理删除。
例如,一个Student
有很多老师,一个Teacher
有很多学生。联接实体/表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? ...*/);
您应该在此处指定删除父记录(Student
或Teacher
)时数据库必须对子记录(StudentTeacher
)执行的操作:如果存在相应的子记录,则也删除(Cascade
)或禁止并抛出错误(Restrict
)。使用Restrict
时,必须先手动删除子记录,然后再删除父记录。
但只有您可以决定必须为每个关系应用什么操作 - 这是您的应用程序,我们不知道它的所有要求。
重要提示:使用Cascade
,例如,删除Teacher
将仅影响(删除)StudentTeacher
中的记录(具有相应的TeacherId
),但Students
将保持不变。
重要提示 2:在 MS SQL Server 中(您没有编写正在使用的数据库引擎),您只能将一个设置为Cascade
(其他应Restrict
),否则在应用迁移时会收到错误(在表_some_table_上引入外键约束_some_name_可能会导致循环或多个级联路径。
起初对联接表进行建模似乎令人困惑,因为 <=EF6 不需要它。但这实际上很简单。
删除Teacher
实体时,需要删除其与所有Student
实体的关系。删除Student
实体时,需要删除其与所有Teacher
实体的关系。
因此,必须始终CASCADE
删除联接实体。