由于级联删除而导致的“ FOREIGN KEY约束引入”

约瑟夫·坎贝尔

在表“ CurrentAnimal”上引入FOREIGN KEY约束“ FK_dbo.CurrentAnimal_dbo.AnimalClass_SelectedAnimalClass”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

我调查了这个问题,并从下面的问题中发现了最多的问题。

引入FOREIGN KEY约束可能会导致循环或多个级联路径-为什么?

但是,我无法从中找到解决方案,因为我与提问者之间的实体关系明显不同。

想象一下,我的网站用于浏览动物园中的许多不同动物,您首先通过选择AnimalClass(例如鸟类),然后选择Species(也许是鹰),最后是动物园中所有鹰中的特定动物来过滤搜索(我们叫他杰克鹰)。

为了做到这一点,我有3个模型(AnimalClass <Species <Animal),每个模型与它下面的实体是一对多的关系,然后我又有1个模型(CurrentAnimal),这3个模型中的每个都有1个。用于管理目的,以跟踪特定的

AnimalClass <物种<Animal

用户要求查看。

AnimalClass.cs

  public class AnimalClass
  {
    public int Id { get; set; }

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

    //Navigation property
    public virtual ICollection<Species> Species { get; set; }
  }

Species.cs

  public class Species
  {
    public int Id { get; set; }

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

    [Required]
    public int SpeciesAnimalClassId { get; set; }//Foreign Key to the parent Animal Class

    [ForeignKey("SpeciesAnimalClassId")]
    public virtual AnimalClass SpeciesAnimalClass { get; set; }

    //Navigation property
    public virtual ICollection<Animal> Animals { get; set; }
  }

Animal.cs

  public class Animal
  {
    public int Id { get; set; }

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

    [Required]
    public int AnimalsSpeciesId { get; set; }//Foreign Key to the parent Animal Species

    [ForeignKey("AnimalsSpeciesId")]
    public virtual Species AnimalsSpecies { get; set; }
  }

CurrentAnimal.cs

  public class CurrentAnimal
  {
    [Key, ForeignKey("User")]//Acts as both the key to the table, and foreign key to users
    public string UserId { get; set; }

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

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

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

    [ForeignKey("SelectedAnimalClass")]
    public virtual AnimalClass AnimalClass { get; set; }

    [ForeignKey("SelectedSpecies")]
    public virtual Species Species { get; set; }

    [ForeignKey("SelectedAnimal")]
    public virtual Animal Animal { get; set; }

    public virtual ApplicationUser User { get; set; }
  }

我知道问题是我有多个导致异常的级联删除,但我根本无法弄清楚需要删除哪些必需注释,还是需要禁用使用Fluent API进行级联删除的实体。

我尝试在CurrentAnimal.cs中删除必需的注释,然后在DbContext中使用Fluent API禁用对AnimalClass,Species和Animal的级联删除,但这并没有更改或删除错误。

这是我在CurrentAnimal.cs中删除“必需”标签之后尝试的方法

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  modelBuilder.Entity<CurrentAnimal>()
      .HasRequired(s => s.AnimalClass)
      .WithMany()
      .WillCascadeOnDelete(false);

  modelBuilder.Entity<CurrentAnimal>()
      .HasRequired(s => s.Species)
      .WithMany()
      .WillCascadeOnDelete(false);

  modelBuilder.Entity<CurrentAnimal>()
      .HasRequired(s => s.Animal)
      .WithMany()
      .WillCascadeOnDelete(false);

}
马蒂·维克库宁(Matti Virkkunen)

多个级联路径是由以下事实引起的:删除“物种”时,有两条路径可能会导致删除CurrentAnimal:

Species -> Animal -> CurrentAnimal
Species -> CurrentAnimal

AnimalClass也是如此。

如果您绝对必须具有这些冗余引用,则需要使其中一些成为没有级联的外键。从理论上讲,它应该仍然起作用。

但是,更好的解决方案是不要使用多余的引用,因为这将导致数据不一致。例如,您可能拥有一个CurrentAnimal,其中的SelectedSpecies与SelectedAnimal的种类不同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

引入FOREIGN KEY约束可能会导致循环或多个级联路径。指定删除时不执行任何操作

在表 'Y' 上引入 FOREIGN KEY 约束 'X' 可能会导致循环或多个级联路径

引入FOREIGN KEY约束可能会导致循环或多个级联路径

引入FOREIGN KEY约束可能会导致循环或多个级联路径-为什么?

SQL Server 引入 FOREIGN KEY 约束可能会导致循环或多个级联路径

在表上引入FOREIGN KEY约束可能会导致循环或多个级联路径,即使在完全删除受影响的字段之后也是如此

ef core 2 - 在表“Y”上引入 FOREIGN KEY 约束“X”可能会导致循环或多个级联路径

如何防止错误:在表上引入FOREIGN KEY约束可能会导致循环或多个级联路径

Entity Framework Core 5 - 在表上引入 FOREIGN KEY 约束可能会导致循环或多个级联路径

SQL错误:引入FOREIGN KEY约束可能会导致循环或多个级联路径。实体框架核心

在表 'ReservedSeats' 上引入 FOREIGN KEY 约束 'FK_ReservedSeats_Seats_SeatId' 可能会导致循环或多个级联路径

实体框架级联删除-FOREIGN KEY约束

具有相同必需属性类型的EF Core TPH实体导致“引入FOREIGN KEY约束”异常

在表“ Employer”上引入FOREIGN KEY约束“ FK__Employer__postal__59FA5E80”可能会导致循环或多个级联路径

SQLite删除级联不起作用:FOREIGN KEY约束失败

无法执行DbCommand引入的FOREIGN KEY约束

引入FOREIGN KEY约束-数据库设置

MySQL FOREIGN KEY错误,已删除级联

SQLite:FOREIGN KEY约束删除失败

可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束

与FOREIGN KEY约束冲突

“介绍FOREIGN KEY约束”错误

Django的FOREIGN KEY约束失败

FOREIGN KEY可能会导致循环或多个级联路径异常

onDelete = NO_ACTION导致错误:“ SQLiteConstraintException:FOREIGN KEY约束失败”(代码787)

Rails 5.2错误更改或删除表列(SQLite3 :: ConstraintException:FOREIGN KEY约束失败:DROP TABLE)

无法删除对象'dbo.Table1',因为它已被FOREIGN KEY约束引用

删除会议室表时,Android Room FOREIGN KEY约束失败

即使从子表中删除了记录,INSERT语句也与FOREIGN KEY约束冲突。