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

StackOverflow https://stackoverflow.com//questions/20020531

Вопрос

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

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

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

и match модель:

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; } //

    public virtual Team TeamHome { get; set; }
    public virtual Team TeamAway { get; set; }
}
.

Но после того, как проект работает, у меня есть следующий исключение:

Введение внешних ключевых ограничений «fk_dbo.matches_dbo.teams_teamhomeid» на таблице «совпадения» могут вызывать циклы или несколько каскадных путей.Укажите на удалении никаких действий или в обновлении нет действий, или измените другие ограничения внешних ключей. Не мог создать ограничение.

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

Это было полезно?

Решение

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

Установите каскад на удаление в 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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
modelBuilder.Entity<Match>()
               .HasRequired(a => a.TeamHome )
               .WithMany()
               .HasForeignKey(u => u.TeamHomeId);

modelBuilder.Entity<Match>()
               .HasRequired(a => a.TeamAway )
               .WithMany()
               .HasForeignKey(u => u.TeamAwayId);
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top