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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top