Como criar duas propriedades de navegação para um modelo (EF6 Primeiro Código)
-
21-12-2019 - |
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 ?
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);
}