Как создать два свойства навигации для одной модели (первый код EF6)

.net c# code-first entity-framework-6

Вопрос

Используя EF6 Code First, я хочу создать модель с двумя внешними ключами в одну и ту же таблицу. Например, теперь у меня есть Team model:

public class Team
{
    public Guid Id { get; set; }
    public String Name { get; set; }

    public virtual ICollection<Match> Matches { get; set; }
}

и матч модель:

public class Team
{
    public Guid Id { get; set; }
    public String Name { get; set; }

    public virtual ICollection<Match> Matches { get; set; }
}

Но после запуска проекта у меня появилось следующее исключение:

Представление ограничения FOREIGN KEY «FK_dbo.Matches_dbo.Teams_TeamHomeId» в таблице «Матчи» может вызывать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY. Не удалось создать ограничение.

Любые рекомендации?

Принятый ответ

SQL Server возвращает ошибку, потому что не может обрабатывать несколько каскадных путей. Многократный путь - это Match, имеющий много свойств Team .

Установите каскад при удалении в значение false.

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Match>()
                    .HasRequired<Team>(i => i.TeamHome)
                    .WithMany(i => i.Matches)
                    .WillCascadeOnDelete(false);

        base.OnModelCreating(modelBuilder);
    }

Поскольку нет каскадного удаления, вы должны сначала удалить команды, прежде чем удалять команду.


Популярные ответы

попробуйте, если вы используете миграции. Миграции не являются умными каждый раз, вы должны иногда переписывать код.

public class Match
{
    public Guid Id { get; set; }
    public Int32 TeamHomeScore { get; set; }
    public Int32 TeamAwayScore { get; set; }

    public Guid TeamHomeId { get; set; } // I want these properties to be foreign keys
    public Guid TeamAwayId { get; set; } //

    [ForeginKey("TeamHomeId")]
    public virtual Team TeamHome { get; set; }
    [ForeginKey("TeamAwayId")]
    public virtual Team TeamAway { get; set; }
}

а затем вы добавите ниже свой DataContex.cs

public class Match
{
    public Guid Id { get; set; }
    public Int32 TeamHomeScore { get; set; }
    public Int32 TeamAwayScore { get; set; }

    public Guid TeamHomeId { get; set; } // I want these properties to be foreign keys
    public Guid TeamAwayId { get; set; } //

    [ForeginKey("TeamHomeId")]
    public virtual Team TeamHome { get; set; }
    [ForeginKey("TeamAwayId")]
    public virtual Team TeamAway { get; set; }
}



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему