'介绍FOREIGN KEY约束'由于级联删除

时间:2016-07-02 04:21:50

标签: c# entity-framework foreign-key-relationship cascading-deletes ef-fluent-api

  

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

我已经研究过这个问题并从下面的问题中发现了最多。

Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths - why?

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

想象一下,我的网站用于浏览动物园中的许多不同的动物,并通过首先选择AnimalClass(比如鸟),然后选择物种(可能是鹰),最后选择所有鹰派中的特定动物来过滤搜索在动物园里(让他们叫他Jake the Hawk)。

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

  

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

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

}

1 个答案:

答案 0 :(得分:1)

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

sudo -H gedit /etc/apache2/apache2.conf

同样适用于AnimalClass。

如果绝对必须有这些冗余引用,则需要将其中一些作为外键而不进行级联。理论上它应该仍然有效。

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