代码优先的外键约束错误...与模型优先工作正常

时间:2017-11-20 19:27:46

标签: c# asp.net-mvc entity-framework

我正在尝试使用代码优先方法创建学校基础应用程序但在我的结果表上获得“外键约束错误”...尝试使用模型优先方法制作相同的应用程序并且其工作正常... < / p>

这是我得到的错误

  

发生了'System.Data.SqlClient.SqlException'类型的异常   EntityFramework.dll但未在用户代码中处理

     

其他信息:介绍FOREIGN KEY约束   表上的'FK_dbo.Semestersubjects_dbo.Semesters_semesterId'   “Semestersubjects”可能会导致循环或多个级联路径。指定   ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN   关键约束。

     

无法创建约束或索引。查看以前的错误。

这是我的上下文类的样子

 public class student
    {
        public student()
        {
            this.SemesterStudents = new HashSet<Semesterstudent>();
        }

        public int id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Semesterstudent> SemesterStudents { get; set; }
    }
    public class Semester
    {
        public Semester()
        {
            this.SemesterStudents = new HashSet<Semesterstudent>();
            this.Semestersubjects = new HashSet<Semestersubject>();
        }
        public int id { get; set; }
        public string Name { get; set; }
        ICollection<Semesterstudent> SemesterStudents { get; set; }
        ICollection<Semestersubject> Semestersubjects { get; set; }
    }
    public class Semesterstudent
    {
        public Semesterstudent()
        {
            this.Results = new HashSet<Result>();
        }
        public int id { get; set; }
        public int studentId { get; set; }
        public int semesterId { get; set; }
        public virtual student students { get; set; }
        public virtual Semester semesters { get; set; }
        public virtual ICollection<Result> Results { get; set; }
    }
    public class Semestersubject
    {
        public Semestersubject()
        {
            this.Results = new HashSet<Result>();
        }
        public int id { get; set; }
        public int semesterId { get; set; }
        public string Title { get; set; }

        public virtual Semester semesters { get; set; }
        public virtual ICollection<Result> Results { get; set; }
    }
    public class Result
    {
        public int id { get; set; }
        public int SemesterstudentId { get; set; }
        public int SemestersubjectId { get; set; }
        public int Marks { get; set; }
        public virtual Semesterstudent SemesterStudents { get; set; }
        public virtual Semestersubject SemesterSubjects { get; set; }
    }

1 个答案:

答案 0 :(得分:0)

正如评论所述,您应该显示OnModelCreating方法以获得更好的答案。但要为您解密错误消息,它说删除操作存在问题 - 它是级联的(例如,如果删除一个实体,它也会删除相关实体)。这个问题是,如果你要删除SemesterSubject,那么级联也将删除Semester,然后(假设Semester删除操作也是级联)也删除引用错误SemesterSubjects

的相关may cause cycles or multiple cascade paths

再次,如果您显示OnModelCreating,您将获得有关如何修复错误的更好信息,但简短的回答是配置您的外键以更改OnDelete行为,这样就不会出现这种情况。 t cascade例如。 (可能会有所不同,具体取决于您使用的版本等)。

builder.Entity<SemesterSubject>(entity =>
{
    entity.HasOne(e => e.semesters)
        .WithMany(e => e.Semestersubjects)
        .HasForeignKey(e => e.semesterId)
        .OnDelete(DeleteBehavior.Restrict);
});