';引入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);
}
多个级联路径是由于删除一个物种时,有两个路径可能会导致删除CurrentAnimal:
Species -> Animal -> CurrentAnimal
Species -> CurrentAnimal
AnimalClass也是如此。
如果你绝对必须有这些冗余的引用,你需要使其中一些是没有级联的外键。它在理论上应该仍然有效。
然而,更好的解决方案是不要有无关的引用,因为这会导致数据不一致。例如,您可能有一个CurrentAnimal,其SelectedSpecies与SelectedAnimal的物种不同。