Come creare due proprietà di navigazione su un modello (primo codice EF6)
-
21-12-2019 - |
Domanda
Utilizzando la prima convenzione del codice EF6, voglio creare il modello con due tasti estranei sulla stessa tabella.Ad esempio, ora ho Team Modello:
public class Team
{
public Guid Id { get; set; }
public String Name { get; set; }
public virtual ICollection<Match> Matches { get; set; }
}
.
e Match Modello:
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; }
}
.
Ma dopo il progetto in esecuzione ho avuto la prossima eccezione:
.Presentazione del vincolo del tasto estraibile 'fk_dbo.matches_dbo.teams_teamhomeid' on Table 'partite' può causare cicli o percorsi a cascata multipli.Specificare eliminare nessuna azione o aggiornamento Nessuna azione o modificare altri vincoli di tasti estranei. Impossibile creare vincoli.
Qualsiasi raccomandazione?
Soluzione
SQL Server restituisce un errore perché non può gestire più percorsi a cascata.Il percorso multiplo è il Match avente molte proprietà Team .
Imposta cascata su Elimina su False.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Match>()
.HasRequired<Team>(i => i.TeamHome)
.WithMany(i => i.Matches)
.WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}
.
Dal momento che non c'è la cascata Elimina, è necessario eliminare le partite della squadra prima di eliminare il team stesso.
Altri suggerimenti
Prova questo, se usi le migrazioni.Le migrazioni non sono intelligenti ogni volta, è necessario intervenire il codice a volte.
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 poi ti aggiungerai sotto al tuo 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);
}
.