1

Введение в ограничение внешнего ключа «» 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); 

} 
+0

Почему у вашего объекта CurrentAnimal (нечетное имя) есть поля для «вида» и «класса животных»? Эти данные уже доступны через ссылку на «животных» и могут привести к несоответствиям в вашей базе данных. –

+0

... ты совершенно прав. Поэтому мне даже не нужно хранить другие два класса, потому что я мог бы просто ссылаться на виды животных, а затем ссылаться на виды животных классов? Будет ли это исправлять проблему? –

ответ

1

несколько путей каскада вызваны тем, что когда вид удаляется, есть два пути, которые могут вызвать удаление ofAnimalAnimal:

Species -> Animal -> CurrentAnimal 
Species -> CurrentAnimal 

То же самое касается AnimalClass.

Если вы абсолютно должны иметь эти избыточные ссылки, вам нужно сделать некоторые из них внешними ключами без каскада. Он должен по-прежнему работать в теории.

Лучшее решение, однако, не должно иметь посторонних ссылок, поскольку это приведет к несогласованности данных. Например, у вас может быть CurrentAnimal с SelectedSpecies, который не совпадает с видом SelectedAnimal.

+0

Да, это, похоже, проблема. Я мог сохранить их, но не имеет смысла хранить избыточную информацию. Я попытаюсь удалить их. –

+0

Это исправлено. Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^