【发布时间】:2019-12-13 09:38:01
【问题描述】:
按照1-to-m 结合n-to-m 的配置指南,我建立了一个包含多个学生和课程的学校系统> 实例。每个Student 实例可能包含一个指向某个Course 实例的链接(反之亦然)。 Student 实例可以包含多个这样的链接(反之亦然)。
这适用于那些指南。但是当组合它们时,我在更新数据库时收到以下错误消息,尽管这样的迁移是正确生成的。
在表“Student_Course”上引入 FOREIGN KEY 约束“FK_Student_Course_Students_StudentId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束或索引。查看以前的错误。
过了一会儿,我意识到问题的发生是由于我的学校在删除学生和课程时级联。反过来,它们与它们之间的 n 对 m 关系具有级联关系。这是一个嘘声,因为一旦删除,就无法重新删除。
复杂之处在于我可能只删除一门课程(然后想从中级联),但我也可能只删除一个学生(并希望从中级联)。
所以我需要涵盖以下情况。
- 学校已删除 -> 每个学生已删除,每个课程已删除,每个学生课程已删除
- 学生已删除 -> 学生课程推荐已删除
- 课程已删除 -> 学生课程推荐已删除
我应该如何重新配置我的模型构建器以仅导致一个删除分支?
当前配置是这样设置的。
builder.Entity<Student_Course>().HasKey(sc => new { sc.StudentId, sc.CourseId });
builder.Entity<School>().HasMany(e => e.Courses)
.WithOne(e => e.School).HasForeignKey(e => e.SchooldId);
builder.Entity<School>().HasMany(e => e.Students)
.WithOne(e => e.School).HasForeignKey(e => e.SchooldId);
模型看起来像这样。
public class School
{
public Guid Id { get; set; }
public virtual IList<Student> Students { get; set; }
public virtual IList<Course> Courses { get; set; }
}
public class Student
{
public Guid Id { get; set; }
public virtual IList<Student_Course> Student_Course { get; set; }
public Guid SchooldId { get; set; }
public virtual School School { get; set; }
}
public class Course
{
public Guid Id { get; set; }
public virtual IList<Student_Course> StudentCourses { get; set; }
public Guid SchooldId { get; set; }
public virtual School School { get; set; }
}
public class Student_Course
{
public Guid StudentId { get; set; }
public virtual Student Student { get; set; }
public Guid CourseId { get; set; }
public virtual Course Course { get; set; }
}
【问题讨论】:
-
您必须在 2 和 3 之间进行选择。它们不能同时级联。另一条路径必须手动编程。
-
@GertArnold 感谢您的评论。我不禁想知道为什么会出现这样的限制。毕竟,这并不是那种不寻常的情况。是我不知道的限制背后的技术吗?
-
这是一个臭名昭著的 Sql Server 限制。
标签: c# ef-code-first ef-fluent-api ef-core-2.2 .net-core-2.2