首页 > 解决方案 > 在表“xxx”上引入 FOREIGN KEY 约束“xxx”可能会导致循环或多个级联路径 [EF Core]

问题描述

我开始从事一个新项目,这是我第一次与一个大型项目一起entity framework core工作,我与之合作Code first approach并且我有很多实体。

当我开始添加新migrationmigration添加成功但是当我尝试时update database 我看到了这个错误:

在表“ExamMarks”上引入 FOREIGN KEY 约束“FK_ExamMarks_Students_StudentId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束或索引。请参阅以前的错误。

学生单位:

 public class Student
    {
        [Key]
        public string Id { get; set; }

        [Required]
        public string FirstName { get; set; }

        [Required]
        public string FamiyName { get; set; }

        [Required]
        public DateTime BirthDate { get; set; }

        [Required]
        public string BirthPlace { get; set; }

        [Required]
        public Gender Gender { get; set; }

        public string NationalId { get; set; }

        [Required]
        public string Natinality { get; set; }

        public string PassportId { get; set; }

        public string ResideneCardId { get; set; }

        [Phone]
        public string PhoneNumber { get; set; }

        [EmailAddress]
        public string Email { get; set; }

        public string Address { get; set; }

        [Phone]
        public string ParentsPhoneNumber { get; set; }

        [Required]
        public DateTime DateOfRegistration { get; set; }

        [Required]
        public string GuardianNationalId { get; set; }

        [Required]
        public string GuardianName { get; set; }

        [Required]
        public string GuardianProfession { get; set; }

        [Required]
        [Phone]
        public string GuardianPhoneNumber { get; set; }

        public byte[] Picture { get; set; }

        [Required]
        public int StudyLevelId { get;   set; }

        [Required]
        public string AcademicYearOfRegistration { get; set; }

        [Required]
        public string GroupId { get; set; }


        public virtual StudyLevel                          StudyLevel       { get; set; }
        public virtual AcademicYear                        AcademicYear     { get; set; }
        public virtual Group                               Group            { get; set; }
        public virtual ICollection<StudentAbsence>         Absences         { get; set; }
        public virtual ICollection<TestMark>               TestMarks        { get; set; }
        public virtual ICollection<ExamMark>               ExamMarks        { get; set; }
        public virtual ICollection<StudentPayment>         Payements        { get; set; }
        public virtual ICollection<StudentMonthlyPayement> MonthlyPayements { get; set; }
        public virtual StudentTrainingMark                 TrainingMark     { get; set; }
        public virtual StudentProjectMark                  ProjectMark      { get; set; }
        public virtual ICollection<StudentYearlyResult>    YearlyResults    { get; set; }
        public virtual StudentDiplomaResult                DiplomaResult    { get; set; }

考试标记实体:

public class ExamMark
{
    [Key]
    public int Id { get; set; }

    [Required]
    public decimal Mark { get; set; }

    [Required]
    public ExamMarkCategory MarkCategory { get; set; }

    [Required]
    public DateTime MarkDate { get; set; }

    public string Note { get; set; }

    public byte[] Arg1 { get; set; }
    public byte[] Arg2 { get; set; }
    public byte[] Arg3 { get; set; }
    public byte[] Arg4 { get; set; }

    [Required]
    public int ExamId { get; set; }

    [Required]
    public string StudentId { get; set; }



    public virtual Exam    Exam    { get; set; }
    public virtual Student Student { get; set; }
}

OnModelCreating重写的方法我写了这个:

protected override void OnModelCreating( ModelBuilder modelBuilder )
{

    modelBuilder.Entity<DiplomaLevel>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );
    modelBuilder.Entity<Exam>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );
    modelBuilder.Entity<ExamMark>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );

    modelBuilder.Entity<GroupProfSubject>().Property( e => e.Id ).HasDefaultValueSql( "NEWID()" );

    modelBuilder.Entity<PedagogicalGoal>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );
    modelBuilder.Entity<PedagogicalSequence>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );
    modelBuilder.Entity<Prof>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );
    modelBuilder.Entity<ProfAbsence>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );
    modelBuilder.Entity<StudentAbsence>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );
    modelBuilder.Entity<StudentDiplomaResult>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );
    modelBuilder.Entity<StudentMonthlyPayement>().Property(e => e.Id).UseIdentityColumn(1, 1);
    modelBuilder.Entity<StudentPayment>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );
    modelBuilder.Entity<StudentProjectMark>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );
    modelBuilder.Entity<StudentTrainingMark>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );
    modelBuilder.Entity<StudentYearlyResult>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );
    modelBuilder.Entity<StudyLevel>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );
    modelBuilder.Entity<Test>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );
    modelBuilder.Entity<TestMark>().Property( e => e.Id ).UseIdentityColumn( 1 , 1 );

    modelBuilder.Entity<ExamMark>().HasOne(e => e.Student).WithMany(e => e.ExamMarks).HasForeignKey(e => e.StudentId).OnDelete(DeleteBehavior.NoAction);

    base.OnModelCreating(modelBuilder);

}

注意: 我正在从事有针对性的项目.Net 5

所以请帮助解决这个问题?并提前致谢。

标签: c#entity-framework-core.net-5

解决方案


推荐阅读