Ho un semplice DbContext, MyDbContext, con 2 DbSets:
public DbSet<User> Users { get; set; }
public DbSet<Privilege> Privileges { get; set; }
Quando ho eseguito add-migration nella console PM, le migrazioni sono state generate correttamente. Ho quindi aggiunto il codice per inizializzare la tabella dei privilegi. Il codice che ho aggiunto è in Startup.Configure ():
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
serviceScope.ServiceProvider.GetService<OneSourceDbContext>().Database.Migrate();
serviceScope.ServiceProvider.GetService<OneSourceDbContext>().EnsureSeedData();
}
GuaranteSeedData è un metodo di estensione che assomiglia a questo:
public static void EnsureSeedData(this OneSourceDbContext context)
{
if (!context.Database.GetPendingMigrations().Any())
{
if (!context.Privileges.Any())
{
context.Privileges.Add(new Models.Privilege { Name = "Add/Edit" });
context.SaveChanges();
}
}
}
Dopo aver aggiunto questo codice, ho eliminato tutte le migrazioni e ho provato a generare di nuovo, ma questa volta stava dicendo che i privilegi sono oggetti non validi. Inoltre, è stato generato un DB vuoto anche se non ho ancora eseguito il progetto e non ho chiamato update-database. Se commento CommentSeedData nel metodo Configure (), vengono generate le migrazioni.
Ho pensato che le 2 righe Database.Migrate () e EnsureSeedData () sarebbero state richiamate solo quando ho eseguito il progetto, ma sembra che questo controllo all'interno di GuaranteSeedData ()
!context.Privileges.Any()
sta causando il fallimento delle migrazioni. La migrazione aggiunta realmente chiama Configure () in avvio? La sua confusione perché voglio solo creare i file di migrazione, perché esegue (o sembra eseguire) GuaranteSeedData ()?
Startup.Configure()
dovrebbe contenere solo il codice per configurare la pipeline della richiesta. Qualsiasi codice di avvio / inizializzazione dell'app dovrebbe essere Program.Main()
in Program.Main()
.