C# System.Data.SqlClient.SqlException:';引入外键约束
我使用的是代码优先的Entity Framework Core方法,但在尝试启动应用程序时收到以下错误: System.Data.SqlClient.SqlException:'引入外键 表“Grades”上的约束“FK_Grades_StudentId”可能导致 循环或多个级联路径。指定ON DELETE NO ACTION或ON 不更新任何操作,或修改其他外键约束。不能 创建约束或索引。请参阅前面的错误。” 我的实体: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]
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
表之间的连接。使用等级
表作为多对多关系表