Pergunta

Usando EF6 Código Primeira convenção, eu quero criar o modelo com duas chaves estrangeiras para a mesma tabela.Por exemplo, agora eu tenho Equipa modelo:

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

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

e Partida modelo:

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

Mas depois de projeto executando, eu tenho a seguinte exceção:

A introdução de restrição de CHAVE ESTRANGEIRA 'FK_dbo.Matches_dbo.Teams_TeamHomeId' na tabela 'Correspondências' pode causar ciclos ou vários caminhos em cascata.Especificar EM EXCLUIR NENHUMA AÇÃO ou NÃO AÇÃO, ou modificar outras restrições de CHAVE ESTRANGEIRA.Não poderia criar a restrição.

Alguma recomendação ?

Foi útil?

Solução

SQL Server está retornando um erro porque ele não pode lidar com vários caminhos em cascata.O caminho múltipla é a Partida ter muitos Equipa propriedades.

Conjunto de cascata em delete para false.

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

        base.OnModelCreating(modelBuilder);
    }

Uma vez que não há exclusão em cascata, você deve excluir o time corresponde a primeiro antes de eliminar a equipe em si.

Outras dicas

tente isto, se você usar migrações.As migrações não são inteligentes sempre, você deve interreput o código algumas vezes.

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

e, em seguida, você irá adicionar abaixo para seu 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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top