C# System.Data.SqlClient.SqlException:';引入外键约束

C# System.Data.SqlClient.SqlException:';引入外键约束,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我使用的是代码优先的Entity Framework Core方法,但在尝试启动应用程序时收到以下错误: System.Data.SqlClient.SqlException:'引入外键 表“Grades”上的约束“FK_Grades_StudentId”可能导致 循环或多个级联路径。指定ON DELETE NO ACTION或ON 不更新任何操作,或修改其他外键约束。不能 创建约束或索引。请参阅前面的错误。” 我的实体: public class Student { [Key]

我使用的是代码优先的Entity Framework Core方法,但在尝试启动应用程序时收到以下错误:

System.Data.SqlClient.SqlException:'引入外键 表“Grades”上的约束“FK_Grades_StudentId”可能导致 循环或多个级联路径。指定ON DELETE NO ACTION或ON 不更新任何操作,或修改其他外键约束。不能 创建约束或索引。请参阅前面的错误。”

我的实体:

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);
            });
公共班级学生
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共Guid Id{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串密码{get;set;}
公共字符串电子邮件{get;set;}
公共组组{get;set;}
public IEnumerable Subjects{get;set;}=new List();
}
公共课科目
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共Guid Id{get;set;}
公共字符串名称{get;set;}
public IEnumerable Grades{get;set;}=new List();
[外籍人员(“学生ID”)]
公立学生学生{get;set;}
公共Guid StudentId{get;set;}
}
公营班级
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共Guid Id{get;set;}
公共双值{get;set;}
公共DateTime DateOfGettingGrade{get;set;}
[外键(“主体”)]
公共主题主题{get;set;}
公共Guid主体ID{get;set;}
[外籍人员(“学生ID”)]
公立学生学生{get;set;}
公共Guid StudentId{get;set;}
}
实体(“GradeBook.Core.Models.Grade”,b=>
{
b、 HasOne(“成绩册、核心、模型、学生”、“学生”)
.有很多
.HasForeignKey(“学生ID”)
.OnDelete(DeleteBehavior.Cascade);
b、 HasOne(“成绩册、核心、模型、主题”、“主题”)
.有许多(“等级”)
.HasForeignKey(“主体”)
.OnDelete(DeleteBehavior.Cascade);
});

您在
等级上有一个不必要的外键<代码>成绩
参考资料
科目
科目
参考资料
学生
。因此,当
科目
也引用
学生
时,从
年级
引用
学生
会创建一个冗余路径。从
Grade
Subject
中删除
Student
之所以有多个级联路径,是因为您可以通过两种方式从
Grade
Subject
Grade->Student->Subject
或直接连接
Grade->Subject
。您必须删除其中一个引用,我的建议是删除
Student
Subject
表之间的连接。使用
等级
表作为多对多关系表