';引入FOREIGN KEY约束';由于级联删除

本文关键字:级联 删除 约束 引入 FOREIGN KEY 于级联 | 更新日期: 2023-09-27 17:54:12

引入FOREIGN KEY约束表上的'FK_dbo.CurrentAnimal_dbo.AnimalClass_SelectedAnimalClass'"CurrentAnimal"可能导致循环或多个级联路径。指定ONDELETE NO ACTION或ON UPDATE NO ACTION,或修改其他外键约束。

我研究了这个问题,从下面的问题中发现了最多。

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

然而,我无法从中找到解决方案,因为我与提问者有着明显不同的实体关系。

想象一下,我的网站被用来浏览动物园中的许多不同动物,你可以通过首先选择动物类(比如鸟类(,然后选择物种(也许是鹰(,最后从动物园中的所有鹰中选择特定的动物(让我们称他为鹰杰克(来过滤你的搜索。

为了做到这一点,我有三个模型(AnimalClass<Species<Animal(,每个模型都与下面的实体有一对多的关系,然后我又有一个模型(CurrentAnimal

AnimalClass<物种<动物

用户请求查看。

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

规格.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; }
  }

我知道问题是我有多个级联删除导致了异常,我根本不知道需要删除哪些Required注释,或者我需要使用Fluent API禁用级联删除哪个实体。

我尝试删除CurrentAnimal.cs中的Required Annotations,然后在我的DbContext中使用Fluent API禁用AnimalClass、Species和Animal上的级联删除,但这并没有改变或删除错误。

这是我在删除CurrentAnimal.cs 中的Required标签后所做的尝试

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

';引入FOREIGN KEY约束';由于级联删除

多个级联路径是由于删除一个物种时,有两个路径可能会导致删除CurrentAnimal:

Species -> Animal -> CurrentAnimal
Species -> CurrentAnimal

AnimalClass也是如此。

如果你绝对必须有这些冗余的引用,你需要使其中一些是没有级联的外键。它在理论上应该仍然有效。

然而,更好的解决方案是不要有无关的引用,因为这会导致数据不一致。例如,您可能有一个CurrentAnimal,其SelectedSpecies与SelectedAnimal的物种不同。