Quando provo ad aggiungere la migrazione c'è la seguente eccezione:
L'entità seme per il tipo di entità 'Genere' non può essere aggiunta perché ha la navigazione 'Sottogeneri' impostata. Per eseguire il seeding delle relazioni, è necessario aggiungere il seed dell'entità correlata a "Genere" e specificare i valori della chiave esterna {"ParentId"}
Come posso impostare correttamente il seed in EntityFrameworkCore 2.2
Ho la prossima entità
public class Genre
{
[Key] public int Id { get; set; }
[Required] [MaxLength(50)] public string Name { get; set; }
public virtual ICollection<GameGenre> GameGenre { get; set; } = new List<GameGenre>();
public int? ParentId { get; set; }
public virtual Genre ParentGenre { get; set; }
public virtual ICollection<Genre> SubGenres { get; set; } = new List<Genre>();
}
DbContext
public class OnlineGameContext : DbContext
{
public OnlineGameContext(DbContextOptions<OnlineGameContext> options)
: base(options)
{
}
public DbSet<Genre> Genres { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<Genre>()
.HasMany(u => u.SubGenres)
.WithOne(p => p.ParentGenre)
.HasForeignKey(p => p.ParentId);
modelBuilder.Entity<Genre>().HasData(DefaultGenresFactories.Action);
base.OnModelCreating(modelBuilder);
}
}
fabbriche
public static class DefaultGenresFactories
{
public static Genre Action =>
new Genre
{
Id = 5,
Name = "Action",
SubGenres = DefaultSubGenresFactories.Action
};
}
public static class DefaultSubGenresFactories
{
public static ICollection<Genre> Action => new List<Genre>
{
new Genre
{
Id = 15,
Name = "FPS",
ParentId = 5
},
new Genre
{
Id = 16,
Name = "TPS",
ParentId = 5
},
new Genre
{
Id = 17,
Name = "Misc",
ParentId = 5
}
};
}
Il messaggio di eccezione indica che non è possibile utilizzare le proprietà di navigazione durante il seeding con il metodo HasData
, ma è possibile specificare le relazioni solo tramite le proprietà FK.
In altre parole, non è possibile utilizzare le proprietà di navigazione SubGenres
e ParentGenre
per specificare le relazioni, che possono essere specificate solo tramite la proprietà ParentId
.
Quindi rimuovere il
SubGenres = DefaultSubGenresFactories.Action
linea e consolidare DefaultSubGenresFactories.Action
e DefaultGenresFactories.Action
a un singolo elenco di Genre
e utilizzare tale elenco nella chiamata HasData
, oppure se si desidera mantenere separate le classi DefaultGenresFactories
e DefaultSubGenresFactories
come sono attualmente, è sufficiente chiamare HasData
per entrambi ( è additivo):
modelBuilder.Entity<Genre>().HasData(DefaultGenresFactories.Action);
modelBuilder.Entity<Genre>().HasData(DefaultSubGenresFactories.Action);