这个问题在这里已有答案:
我正在使用Entity Framework Core和Code First方法,但在尝试启动应用程序时收到以下错误:
System.Data.SqlClient.SqlException:'在表'Grades'上引入FOREIGN KEY约束'FK_Grades_Students_StudentId'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。无法创建约束或索引。看看以前的错误。'
我的实体:
public class Student
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public Group Group { get; set; }
public IEnumerable<Subject> Subjects { get; set; } = new List<Subject>();
}
public class Subject
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public string Name { get; set; }
public IEnumerable<Grade> Grades { get; set; } = new List<Grade>();
[ForeignKey("StudentId")]
public Student Student { get; set; }
public Guid StudentId { get; set; }
}
public class Grade
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public double Value { get; set; }
public DateTime DateOfGettingGrade { get; set; }
[ForeignKey("SubjectId")]
public Subject Subject { get; set; }
public Guid SubjectId { get; set; }
[ForeignKey("StudentId")]
public Student Student { get; set; }
public Guid StudentId { get; set; }
}
modelBuilder.Entity("GradeBook.Core.Models.Grade", b =>
{
b.HasOne("GradeBook.Core.Models.Student", "Student")
.WithMany()
.HasForeignKey("StudentId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("GradeBook.Core.Models.Subject", "Subject")
.WithMany("Grades")
.HasForeignKey("SubjectId")
.OnDelete(DeleteBehavior.Cascade);
});
你在Grade
上有一个不必要的外键。 Grade
引用Subject
和Subject
引用Student
。因此,当Student
也引用Grade
时,引用Subject
中的Student
会创建一条冗余路径。从Student
或Grade
中删除Subject
。
多个级联路径的原因是你可以通过两种方式从Grade
到Subject
- Grade -> Student -> Subject
或直接连接Grade -> Subject
。你必须删除其中一个引用,我的建议是删除Student
和Subject
表之间的连接。使用Grades
表作为“多对多关系”表。