auto create database in Entity Framework Core

La mia applicazione che viene portata su .NET core utilizzerà il nuovo EF Core con SQLite. Voglio creare automaticamente il database e le strutture delle tabelle quando l’app viene eseguita per la prima volta. Secondo la documentazione di base di EF questo viene fatto usando i comandi manuali

dotnet ef migrations add MyFirstMigration dotnet ef database update 

Tuttavia, non voglio che l’utente finale inserisca questi comandi e preferirebbe che l’app creasse e configurasse il database per il primo utilizzo. Per EF 6 c’è funzionalità come

 Database.SetInitializer(new CreateDatabaseIfNotExists()); 

Ma in EF Core questi non sembrano esistere. Non riesco a trovare esempi o documentazione su qualcosa di equivalente per core EF e non è menzionato nell’elenco delle funzionalità mancanti nella documentazione di base EF. Ho già installato le classi del modello in modo da poter scrivere del codice per inizializzare il database basato sui modelli, ma sarebbe più facile se il framework facesse questo automaticamente. Non voglio creare automaticamente il modello o migrare, basta creare le strutture di tabella su un nuovo database.

Mi manca qualcosa qui o la funzione di creazione automatica della tabella manca nel core EF?

Se sono state create le migrazioni, è ansible eseguirle in Startup.cs come segue.

  public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { using (var serviceScope = app.ApplicationServices.GetService().CreateScope()) { var context = serviceScope.ServiceProvider.GetRequiredService(); context.Database.Migrate(); } ... 

Ciò creerà il database e le tabelle utilizzando le migrazioni aggiunte.

Se non stai utilizzando Entity Framework Migrations e invece hai solo bisogno del tuo modello DbContext creato esattamente come nella class di contesto al primo avvio, puoi utilizzare:

  public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { using (var serviceScope = app.ApplicationServices.GetService().CreateScope()) { var context = serviceScope.ServiceProvider.GetRequiredService(); context.Database.EnsureCreated(); } ... 

Anziché.

Se hai bisogno di cancellare il tuo database prima di assicurarti che sia stato creato, chiama:

  context.Database.EnsureDeleted(); 

Poco prima di chiamare ConfirmCreated ()

Adattato da: http://docs.identityserver.io/en/release/quickstarts/8_entity_framework.html?highlight=entity

La mia risposta è molto simile alla risposta di Ricardo, ma sento che il mio approccio è un po ‘più semplice semplicemente perché nella sua funzione di using c’è così tanto che non sono nemmeno sicuro di come funzioni esattamente a un livello inferiore.

Quindi, per coloro che vogliono una soluzione semplice e pulita che crea un database per te dove sai esattamente cosa sta succedendo sotto il cofano, questo è per te:

 public Startup(IHostingEnvironment env) { using (var client = new TargetsContext()) { client.Database.EnsureCreated(); } } 

Questo significa che all’interno del DbContext che hai creato (in questo caso, il mio è chiamato TargetsContext ), puoi usare un’istanza di DbContext per assicurarti che le tabelle definite nella class vengano create quando Startup.cs viene eseguito nel tuo applicazione.

Se ottieni il contesto tramite l’elenco dei parametri di Configura in Startup.cs, puoi farlo invece:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, LoggerFactory loggerFactory, ApplicationDbContext context) { context.Database.Migrate(); ... 

Se non hai creato migrazioni, ci sono 2 opzioni

1.creare il database e le tabelle dall’applicazione Principale:

 var context = services.GetRequiredService(); context.Database.EnsureCreated(); 

2. Crea le tabelle se il database esiste già:

 var context = services.GetRequiredService(); context.Database.EnsureCreated(); RelationalDatabaseCreator databaseCreator = (RelationalDatabaseCreator)context.Database.GetService(); databaseCreator.CreateTables(); 

Grazie alla risposta di Bubi