Eu comecei a usar o código EF primeiro, então sou um iniciante neste tópico.
Eu queria criar relações entre equipes e jogos:
1 partida = 2 equipes (casa, convidado) e resultado.
Eu pensei que era fácil criar um modelo assim, então comecei a codificar:
public class Team
{
[Key]
public int TeamId { get; set;}
public string Name { get; set; }
public virtual ICollection<Match> Matches { get; set; }
}
public class Match
{
[Key]
public int MatchId { get; set; }
[ForeignKey("HomeTeam"), Column(Order = 0)]
public int HomeTeamId { get; set; }
[ForeignKey("GuestTeam"), Column(Order = 1)]
public int GuestTeamId { get; set; }
public float HomePoints { get; set; }
public float GuestPoints { get; set; }
public DateTime Date { get; set; }
public virtual Team HomeTeam { get; set; }
public virtual Team GuestTeam { get; set; }
}
E eu recebo uma exceção:
O relacionamento referencial resultará em uma referência cíclica que não é permitida. [Nome da restrição = Match_GuestTeam]
Como posso criar esse modelo, com 2 chaves estrangeiras na mesma tabela?
Também é possível especificar o
ForeignKey()
atributo na propriedade de navegação:Dessa forma, você não precisa adicionar nenhum código ao
OnModelCreate
métodofonte
OnModelCreate
acordo com a resposta aceita, bem como as duas coleções dos dois lados do relacionamento.Sei que é um post de vários anos e você pode resolver seu problema com a solução acima. No entanto, eu só quero sugerir o uso de InverseProperty para alguém que ainda precisa. Pelo menos você não precisa alterar nada no OnModelCreating.
O código abaixo não foi testado.
Você pode ler mais sobre a InverseProperty no MSDN: https://msdn.microsoft.com/en-us/data/jj591583?f=255&MSPPError=-2147217396#Relationships
fonte
Você pode tentar isso também:
Quando você faz uma coluna FK permitir NULLS, você está interrompendo o ciclo. Ou estamos apenas trapaceando o gerador de esquema EF.
No meu caso, essa modificação simples resolve o problema.
fonte
Isso ocorre porque as exclusões em cascata são ativadas por padrão. O problema é que, quando você chama uma exclusão na entidade, ela também exclui cada uma das entidades referenciadas pela tecla f. Você não deve tornar os valores 'necessários' anuláveis para corrigir esse problema. Uma opção melhor seria remover a convenção de exclusão em cascata do EF Code First:
Provavelmente é mais seguro indicar explicitamente quando fazer uma exclusão em cascata para cada um dos filhos ao mapear / configuração. a entidade.
fonte
Restrict
em vez deCascade
?InverseProperty
no EF Core, a solução é fácil e limpa.InverseProperty
Portanto, a solução desejada seria:
fonte