引入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);
}
答案 0 :(得分:1)
多个级联路径是由于删除物种时有两条路径可能导致删除CurrentAnimal:
sudo -H gedit /etc/apache2/apache2.conf
同样适用于AnimalClass。
如果绝对必须有这些冗余引用,则需要将其中一些作为外键而不进行级联。理论上它应该仍然有效。
然而,更好的解决方案是不要使用无关的引用,因为这会导致数据不一致。例如,您可以拥有一个SelectedAnimal,其SelectedSpecies与SelectedAnimal的种类不同。