c# - 在表“xxx”上引入 FOREIGN KEY 约束“xxx”可能会导致循环或多个级联路径 [EF Core]
问题描述
我开始从事一个新项目,这是我第一次与一个大型项目一起entity framework core
工作,我与之合作Code first approach
并且我有很多实体。
当我开始添加新migration
的migration
添加成功但是当我尝试时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
所以请帮助解决这个问题?并提前致谢。
解决方案
推荐阅读
- spss - 比较或组合列中的值
- r - 在字符之间添加逗号
- javascript - 如何使用条件语句更新 eventlistner 内的变量号
- java - 对象通用返回值(包装类)不允许原始变量赋值
- python - 第一次组在 pandas DataFrame 中满足条件
- chart.js - 一个数据集上的自定义工具提示回调(chartjs v 2.5)
- node.js - 是否可以直接从节点js调用openssl
- excel - 比较工作簿并生成带有突出显示的差异和附加列的报告
- postgresql - postgres:如何计算 UTF-8 中的多字节表情符号字符串显示长度
- c - 读取文件导致的地址清理程序 SEGV 未知错误