Sto usando Entity Framework Core 2.0 per mappare il DB esistente, il DB ha due tabelle: Teams
e SupportTeam
.
Campi squadra: ID, nome
TeamSupport : TeamID (ForeignKey sulla tabella della squadra), SupportTeamID (ForeignKey sulla tabella della squadra)
Ho provato a mapparli come segue:
public class Team
{
public int Id { get; set; }
public string name { get; set; }
public List<TeamSupport> SupportTeams { get; set; }
}
public class TeamSupport
{
public int TeamId { get; set; }
public virtual Team Team { get; set; }
public int SupportTeamId { get; set; } // In lack of better name.
public virtual Team SupportTeam { get; set; }
}
Ma ho avuto l'errore follwing quando eseguo "add-migration":
Impossibile determinare la relazione rappresentata dalla proprietà di navigazione "Team.SupportTeams" di tipo "Elenco". Configurare manualmente la relazione o ignorare questa proprietà utilizzando l'attributo "[NotMapped]" o utilizzando "EntityTypeBuilder.Ignore" in "OnModelCreating".
Il post che stai seguendo è decisamente sbagliato.
Ogni proprietà di navigazione di raccolta o riferimento può essere solo una parte di una singola relazione. Mentre molte a molte relazioni con entità di join esplicita viene implementata con due relazioni da uno a molti. L'entità di join contiene due proprietà di navigazione di riferimento, ma l'entità principale ha solo la proprietà di navigazione della raccolta singola , che deve essere associata a una di esse, ma non a entrambe.
Un modo per risolvere il problema è aggiungere una seconda proprietà di navigazione raccolta:
public class WordEntity
{
public long Id { get; set; }
public string Name { get; set; }
public string Json { get; set; }
public virtual List<WordSinonymEntity> Sinonyms { get; set; }
public virtual List<WordSinonymEntity> SinonymOf { get; set; } // <--
}
e specificare le associazioni tramite API fluente:
modelBuilder.Entity<WordSinonymEntity>()
.HasOne(pt => pt.Sinonym)
.WithMany(p => p.SinonymOf) // <--
.HasForeignKey(pt => pt.SinonymId)
.OnDelete(DeleteBehavior.Restrict); // see the note at the end
modelBuilder.Entity<WordSinonymEntity>()
.HasOne(pt => pt.Word)
.WithMany(t => t.Sinonyms)
.HasForeignKey(pt => pt.WordId);
Un altro modo è quello di lasciare il modello così com'è, ma mappare WordSinonymEntity.Sinonym
all'associazione unidirezionale (con la proprietà di navigazione refeference e nessuna proprietà di navigazione della collezione corrispondente):
modelBuilder.Entity<WordSinonymEntity>()
.HasOne(pt => pt.Sinonym)
.WithMany() // <--
.HasForeignKey(pt => pt.SinonymId)
.OnDelete(DeleteBehavior.Restrict); // see the note at the end
modelBuilder.Entity<WordSinonymEntity>()
.HasOne(pt => pt.Word)
.WithMany(t => t.Sinonyms)
.HasForeignKey(pt => pt.WordId);
Assicurati che WithMany
corrisponda esattamente alla presenza / assenza della proprietà di navigazione corrispondente.
Si noti che in entrambi i casi è necessario disattivare la cancellazione della cascata per almeno una delle relazioni ed eliminare manualmente le entità di collegamento correlate prima di eliminare l'entità principale, poiché le relazioni autoreferenziali introducono sempre possibili cicli o più problemi di percorso a cascata , impedendo l'utilizzo di cascata elimina.