【问题标题】:System.Data.SqlClient.SqlException: 'Introducing FOREIGN KEY constraint [duplicate]System.Data.SqlClient.SqlException:'引入 FOREIGN KEY 约束 [重复]
【发布时间】:2018-08-08 18:19:59
【问题描述】:

我正在使用带有 Code First 方法的 Entity Framework Core,但在尝试启动应用程序时收到以下错误:

System.Data.SqlClient.SqlException: '引入外键 表 'Grades' 上的约束 '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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2014-03-20
        • 2019-10-05
        • 1970-01-01
        • 2013-07-23
        • 1970-01-01
        • 1970-01-01
        • 2016-11-04
        • 2023-03-22
        • 2016-11-29
        相关资源
        最近更新 更多