C# 代码优先时出现外键约束错误…模型优先时工作正常

C# 代码优先时出现外键约束错误…模型优先时工作正常,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我正在尝试使用代码优先的方法创建一个校本应用程序,但在结果表中出现“外键约束错误”…尝试使用模型优先的方法创建相同的应用程序,并且工作正常 这就是我得到的错误 中发生类型为“System.Data.SqlClient.SqlException”的异常 EntityFramework.dll,但未在用户代码中处理 其他信息:引入外键约束 表上的“FK_dbo.Semesters Subjects_dbo.Semesters_semesterId” “Semestersubjects”可能导致循环或

我正在尝试使用代码优先的方法创建一个校本应用程序,但在结果表中出现“外键约束错误”…尝试使用模型优先的方法创建相同的应用程序,并且工作正常

这就是我得到的错误

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

其他信息:引入外键约束 表上的“FK_dbo.Semesters Subjects_dbo.Semesters_semesterId” “Semestersubjects”可能导致循环或多个级联路径。具体说明 删除不操作或更新不操作,或修改其他外部 关键制约因素

无法创建约束或索引。请参阅前面的错误

这就是我的上下文类的样子

 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; }
    }
公共班级学生
{
公立学生()
{
this.SemesterStudents=new HashSet();
}
公共int id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection SemesterStudents{get;set;}
}
公开课学期
{
公共学期()
{
this.SemesterStudents=new HashSet();
this.semestsubjects=new HashSet();
}
公共int id{get;set;}
公共字符串名称{get;set;}
ICollection Semester学生{get;set;}
i集合主题{get;set;}
}
公营班学生
{
公立中学学生()
{
this.Results=newhashset();
}
公共int id{get;set;}
公共int studentId{get;set;}
公共int-semesterId{get;set;}
公共虚拟学生学生{get;set;}
公共虚拟学期{get;set;}
公共虚拟ICollection结果{get;set;}
}
公共课
{
公共主题()
{
this.Results=newhashset();
}
公共int id{get;set;}
公共int-semesterId{get;set;}
公共字符串标题{get;set;}
公共虚拟学期{get;set;}
公共虚拟ICollection结果{get;set;}
}
公开课成绩
{
公共int id{get;set;}
公共int SemesterstudentId{get;set;}
公共int-SemestersubjectId{get;set;}
公共整数标记{get;set;}
公共虚拟semestStudent semestStudents{get;set;}
公共虚拟semestsubject semestsubjects{get;set;}
}

如评论所述,您应该展示您的
OnModelCreating
方法以获得更好的答案。但要为您破译错误消息,它表示删除操作存在问题-它是级联的(例如,如果删除一个实体,它也会删除相关实体)。问题是,如果您要删除一个
semestsubject
,那么级联也会删除
semestsubject
,这将随后删除(假设
semestsubject
删除操作也是级联的)同时删除相关的
semestsubjects
,引用错误
可能导致循环或多个级联路径

同样,如果您在ModelCreating上显示您的
,您将获得有关如何修复错误的更好信息,但简单的回答是配置外键以更改
OnDelete
行为,这样就不会层叠,例如(根据您使用的版本可能会有所不同等)

builder.Entity(Entity=>
{
entity.HasOne(e=>e学期)
.有许多(e=>e.Semestersubjects)
.HasForeignKey(e=>e.semesterId)
.OnDelete(DeleteBehavior.Restrict);
});

如评论所述,您应该展示您的
OnModelCreating
方法以获得更好的答案。但要为您破译错误消息,它表示删除操作存在问题-它是级联的(例如,如果删除一个实体,它也会删除相关实体)。问题是,如果您要删除一个
semestsubject
,那么级联也会删除
semestsubject
,这将随后删除(假设
semestsubject
删除操作也是级联的)同时删除相关的
semestsubjects
,引用错误
可能导致循环或多个级联路径

同样,如果您在ModelCreating上显示您的
,您将获得有关如何修复错误的更好信息,但简单的回答是配置外键以更改
OnDelete
行为,这样就不会层叠,例如(根据您使用的版本可能会有所不同等)

builder.Entity(Entity=>
{
entity.HasOne(e=>e学期)
.有许多(e=>e.Semestersubjects)
.HasForeignKey(e=>e.semesterId)
.OnDelete(DeleteBehavior.Restrict);
});

您需要向我们展示您的OnModelCreating方法。我没有使用OnModelCreating方法…您需要向我们展示您的OnModelCreating方法。我没有使用OnModelCreating方法。。。
builder.Entity<SemesterSubject>(entity =>
{
    entity.HasOne(e => e.semesters)
        .WithMany(e => e.Semestersubjects)
        .HasForeignKey(e => e.semesterId)
        .OnDelete(DeleteBehavior.Restrict);
});