在表“ 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);
}
多个级联路径是由以下事实引起的:删除“物种”时,有两条路径可能会导致删除CurrentAnimal:
Species -> Animal -> CurrentAnimal
Species -> CurrentAnimal
AnimalClass也是如此。
如果您绝对必须具有这些冗余引用,则需要使其中一些成为没有级联的外键。从理论上讲,它应该仍然起作用。
但是,更好的解决方案是不要使用多余的引用,因为这将导致数据不一致。例如,您可能拥有一个CurrentAnimal,其中的SelectedSpecies与SelectedAnimal的种类不同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句