当前位置: 首页 > 知识库问答 >
问题:

系统数据SqlClient。SqlException:“引入外键约束[重复]

段干茂实
2023-03-14

我正在使用实体框架核心和代码优先的方法,但在尝试启动应用程序时收到以下错误:

系统数据SqlClient。SqlException:“在表“Grades”上引入外键约束“FK\U Grades\U StudentId”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他外键约束。无法创建约束或索引。请参阅以前的错误。”

我的实体:

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);
            });

共有2个答案

吕宇定
2023-03-14

多个级联路径的原因是,您可以通过两种方式从GradeSubject,或者Grade-

薛坚
2023-03-14

你有一个不必要的外键在等级等级引用主题主题引用学生。所以当主题也引用学生时,从等级引用学生会创建一个冗余路径。从等级主题中删除学生

 类似资料:
  • mysql 5.7 外键约束 主表:部门表 从表:员工表 添加外键:从表 dep_id 关联 主表 id >[danger] CASCADE > 级联更新 主表数据更新从表会更新外键 级联删除 主表数据删除,从表会一起删除

  • 主要内容:在创建表时设置外键约束,在修改表时添加外键约束,删除外键约束MySQL外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。 外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等 4 种水果,那么,你来到水果摊要买水果就只能选择苹果、桃子、李子和西

  • 注意 当前章节中涉及的配置一般适用于关系数据库。这里展示的扩展方法在你安装了关系数据库提供程序之后就能获得(由Microsoft.EntityFrmeworkCore.Relational 程序包共享)。 外键约束是为模型中的关系引入的。 惯例 按照惯例,外键约束命名为 FK_<依赖实体类型名称>_<主实体类型名称>_<外键属性名称>。对于组合键,<外键属性名> 则为用下划线分隔的外键属性名。 数

  • 问题内容: 在事务SQL中,如何指定外键约束应为1:1关系?声明列UNIQUE是否足够?下面是我现有的代码。 问题答案: 具有UNIQUE和NOT NULL约束的外键列在另一个表中引用UNIQUE,NOT NULL列会创建1:(0 | 1)关系,这可能就是您想要的。 如果存在真正的1:1关系,则第一个表中的每个记录在第二个表中都会有一个对应的记录,反之亦然。在这种情况下,您可能只想制作一张表(除非

  • 问题内容: 由于已经暗示了该关系,因此我不想在db中创建约束。我该怎么办? 目前,我在进行Alembic迁移后手动删除这些约束。 问题答案: 无需定义“模式”级别约束,而是创建自定义的外部条件;将您要用作“外键”的列以及传递给。您必须手动定义原因,因为: 默认情况下,此值是基于父表和子表(或关联表)的外键关系计算的。 外键也可以在using中内联注释: 您可以验证没有为表 c 发出约束: 警告:

  • 问题内容: 我收到此错误消息: 第40行的错误1217(23000):无法删除或更新父行:外键约束失败 …当我尝试放置桌子时: …定义如下: 有趣的是, 我已经删除 了模式中具有外键的 所有其他表。实际上,除了表外,数据库是空的。 如果数据库中没有其他对象,怎么可能会有子行?据我所知,InnoDB不允许在其他模式上使用外键,对吗? (我什至可以运行命令:-?) 问题答案: 两种可能性: 在另一个架