Введение в ограничение внешнего ключа «» FK_dbo.CurrentAnimal_dbo.AnimalClass_SelectedAnimalClass на столе «CurrentAnimal» может вызвать циклов или несколько путей каскада. Укажите ON УДАЛИТЬ НЕТ ДЕЙСТВИЙ или НЕ ОБНОВИТЬ НЕТ ДЕЙСТВИЙ, или изменить другие ограничения FOREIGN KEY .«Введение в ограничение внешнего ключа» из-за каскадного удаляет
Я изучил этот вопрос и нашел больше всего из вопроса ниже.
Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths - why?
Я не могу однако найти решение от него, потому что у меня есть существенно различные отношения сущностей, чем собеседники.
Представьте, что мой сайт используется для просмотра многих животных в зоопарке, и вы отфильтровываете свои поиски, сначала выбирая AnimalClass (скажем, птицу), затем выбираете Species (возможно, ястреб) и, наконец, конкретное животное из всех ястребы в зоопарке (назовем его Джейком Хоуком).
Для этого у меня есть 3 модели (AnimalClass < Виды < Animal), каждая из которых является отношением друг к другу с сущностью ниже нее, а затем у меня есть еще одна модель (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, а затем использовал Fluent API в своем DbContext, чтобы отключить каскадное удаление в 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 (нечетное имя) есть поля для «вида» и «класса животных»? Эти данные уже доступны через ссылку на «животных» и могут привести к несоответствиям в вашей базе данных. –
... ты совершенно прав. Поэтому мне даже не нужно хранить другие два класса, потому что я мог бы просто ссылаться на виды животных, а затем ссылаться на виды животных классов? Будет ли это исправлять проблему? –