System.Data.SqlClient.SqlException:'引入FOREIGN KEY约束[重复]

问题描述 投票:0回答:2

我正在使用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);
            });
c# entity-framework entity-framework-core
2个回答
1
投票

你在Grade上有一个不必要的外键。 Grade引用SubjectSubject引用Student。因此,当Student也引用Grade时,引用Subject中的Student会创建一条冗余路径。从StudentGrade中删除Subject


0
投票

多个级联路径的原因是你可以通过两种方式从GradeSubject - Grade -> Student -> Subject或直接连接Grade -> Subject。你必须删除其中一个引用,我的建议是删除StudentSubject表之间的连接。使用Grades表作为“多对多关系”表。

© www.soinside.com 2019 - 2024. All rights reserved.