Comment créer deux propriétés de navigation sur un modèle (code EF6 en premier)
-
21-12-2019 - |
Question
Utilisation du code EF6 Première convention, je souhaite créer un modèle avec deux clés étrangères sur la même table.Par exemple, j'ai maintenant équipe Modèle:
public class Team
{
public Guid Id { get; set; }
public String Name { get; set; }
public virtual ICollection<Match> Matches { get; set; }
}
et
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; }
}
Mais après le fonctionnement du projet, j'ai une exception suivante:
Présentation de la contrainte de clé étrangère 'fk_dbo.matches_dbo.teams_teamhomeid' On Table 'Matchs' peut provoquer des cycles ou plusieurs chemins de cascade.Spécifiez sur Supprimer aucune action ou sur la mise à jour Aucune action, ni modifier d'autres contraintes de clé étrangère. Ne pouvait pas créer de contrainte.
toute recommandation?
La solution
SQL Server renvoie une erreur car elle ne peut pas gérer plusieurs chemins de cascade.Le chemin multiple est le match
Définir la cascade sur Supprimer sur FALSE.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Match>()
.HasRequired<Team>(i => i.TeamHome)
.WithMany(i => i.Matches)
.WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}
Comme il n'y a pas de cascade supprimée, vous devez d'abord supprimer les matchs de l'équipe avant de supprimer l'équipe elle-même.
Autres conseils
Essayez ceci, si vous utilisez des migrations.Les migrations ne sont pas intelligentes chaque fois, vous devriez parfois interdreper le code.
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; }
}
Et puis vous ajouterez ci-dessous à votre 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);
}