![](/img/trans.png)
[英]How do I specify a many-to-many relationship in EF Core where the connection table is part of a schema?
[英]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? ...*/);
您应该在此处指定在删除父记录(在Student
或Teacher
)时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.