6

Я использую EF6 Code First. У меня есть два класса:EF6 Code First - может вызвать циклы или несколько каскадных путей

public class Player 
{ 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    [Key] 
    public int Id { get; set; } 

    [Required, MinLength(2, ErrorMessage = "Player name must be at least 2 characters length")] 
    public string Name { get; set; } 

    [Required] 
    public int TeamClubId { get; set; } 

    [Required] 
    public int TeamNationalId { get; set; } 

    [Required, ForeignKey("TeamClubId")] 
    public virtual Team Club { get; set; } 

    [Required, ForeignKey("TeamNationalId")] 
    public virtual Team National { get; set; } 

} 

А:

public class Team 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [Required, MinLength(2, ErrorMessage = "Team name must be at least 2 characters length")] 
    public string Name { get; set; } 

    [Required] 
    public TeamType Type { get; set; } 

    public virtual ICollection<Player> Players { get; set; } 
} 

Это мои два класса с их отношениями. Игрок принадлежит к двум командам: клубным и национальным командам. Команда может быть либо клубной, либо национальной, и содержит коллекцию игроков.

В моем контексте файла я использую:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Player>() 
       .HasRequired<Team>(p => p.National) 
       .WithMany(t => t.Players) 
       .WillCascadeOnDelete(false); 

     base.OnModelCreating(modelBuilder); 
    } 

При запуске средства миграции, чтобы обновить базу данных, я получаю следующее сообщение об ошибке:

Вводя ограничение внешнего ключа «FK_dbo.Players_dbo.Teams_TeamNationalId» на Таблица «Игроки» могут вызывать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY. Не удалось создать ограничение. См. Предыдущие ошибки.

Как его решить?

+0

Возможный дубликат [Представление ограничения FOREIGN KEY может вызывать циклы или несколько каскадных путей - почему?] (Http://stackoverflow.com/questions/17127351/introducing-foreign-key-constraint-may-cause-cycles-or - многокаскадные пути) – Colin

+0

Это не тот случай. У меня две команды в классе Player. – janiv

+0

Образец работает на меня. Есть ли у вас какие-либо другие классы в вашей модели, которые могут вызвать круговые зависимости/несколько каскадных путей? Как насчет 'TeamType', это класс или перечисление? –

ответ

9

Использование Fluent API:

 //player - national team relations 
     modelBuilder.Entity<Player>() 
      .HasRequired<Team>(p => p.National) 
      .WithMany() 
      .WillCascadeOnDelete(false); 

     //player - club team relations 
     modelBuilder.Entity<Player>() 
      .HasRequired<Team>(p => p.Club) 
      .WithMany() 
      .WillCascadeOnDelete(false); 
0

Я думаю, тот факт, что ваш Team имеет только одно свойство навигации для двух различных внешних ключей, указывающих на него может быть проблема с кодом EF. Вероятно, более приемлемо иметь два навигационных свойства на вашем Team - по одному для каждого внешнего ключа, указывающего на него.

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