Uso EF Core per creare AppDBContext
e AppDbContextSeed
:
AppDbContextSeed
public class AppDbContextSeed
{
private readonly AppDbContext _dbContext;
private UserManager<AppUser> _userManager;
private RoleManager<AppRole> _roleManager;
public AppDbContextSeed(AppDbContext dbContext, UserManager<AppUser> userManager,
RoleManager<AppRole> roleManager)
{
_dbContext = dbContext;
}
public async Task Seed()
{
...
await _dbContext.SaveChangesAsync();
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<AppDbContextSeed>();
}
Program.cs
public static void Main(string[] args)
{
var host = BuildWebHost(args);
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var appDbContextSeed = services.GetService<AppDbContextSeed>();
appDbContextSeed.Seed().Wait();
}
catch (Exception ex)
{
var logger = services.GetService<ILogger<Program>>();
logger.LogError(ex, "An error occurred while seeding the database");
}
}
host.Run();
}
Quando appDbContextSeed
add-migration
e update-database
, nessun dato da appDbContextSeed
viene inserito nel database. Che cosa ho fatto di sbagliato?
Metti l'esecuzione del seme sul metodo Main
che viene eseguito solo all'avvio dell'applicazione. Se si desidera che il metodo seed venga eseguito nello stesso momento in cui si esegue il comando update-database
, è necessario seguire la nuova funzionalità di seeding dei dati in EF Core 2.1. Questa funzione aggiunge un nuovo metodo alla configurazione delle entità HasData
che consente di aggiungere alcuni dati iniziali.
Questo è un estratto della documentazione delle funzioni di Data Seeding :
Il seeding dei dati consente di fornire dati iniziali per popolare un database. A differenza di EF6, in EF Core, i dati di semina sono associati a un tipo di entità come parte della configurazione del modello. Successivamente, le migrazioni EF Core possono calcolare automaticamente quali operazioni di inserimento, aggiornamento o eliminazione devono essere applicate durante l'aggiornamento del database a una nuova versione del modello.
Vi consiglio di leggere la documentazione per sapere di usare quella nuova funzionalità.