asp.net - onmodelcreating - ¿Cómo y dónde llamar a Database.EnsureCreated y Database.Migrate?
mvc entity framework español (4)
¡Creo que esta es una pregunta importante y debería responderse bien!
¿Qué es Database.EnsureCreated?
context.Database.EnsureCreated()
es un nuevo método principal de EF que garantiza que exista la base de datos para el contexto.
Si existe, no se toman medidas.
Si no existe, se crea la base de datos y todos sus esquemas y también garantiza que sea compatible con el modelo para este contexto.
Nota:
Este método no usa migraciones para crear la base de datos.
Además, la base de datos que se crea no se puede actualizar más tarde mediante migraciones.
Si está apuntando a una base de datos relacional y está usando migraciones, puede usar el método
DbContext.Database.Migrate()
para asegurarse de que se crea la base de datos y se aplican todas las migraciones.
¿Cómo hicimos eso con EF 6?
context.Database.EnsureCreated()
es equivalente a los siguientes enfoques enumerados de EF 6:
-
Consola del administrador de paquetes:
Enable-Migrations -EnableAutomaticMigrations. Add-Migration / Update-Database.
-
Del código:
Database.SetInitializer CreateDatabaseIfNotExists
o
Con DbMigrationsConfiguration y establezca AutomaticMigrationsEnabled = true;
¿Qué es Database.Migrate?
Aplica cualquier migración pendiente para el contexto a la base de datos. Creará la base de datos si aún no existe.
¿Cómo hicimos eso con EF 6?
context.Database.Migrate()
es equivalente a los enfoques enumerados a continuación de EF 6:
-
Consola del administrador de paquetes:
Update-Database -TargetMigration
-
Con una configuración personalizada de DbMigrations:
AutomaticMigrationsEnabled = false; o con DbMigrator.
Conclusión
Si está utilizando migraciones, hay
context.Database.Migrate()
.
Si no desea migraciones y solo desea una base de datos rápida (generalmente para pruebas), use context.Database.EnsureCreated () / GuaranteeDeleted ().
Tengo una aplicación ASP.NET MVC 6 y necesito llamar a los métodos
Database.EnsureCreated
y
Database.Migrate
.
¿Pero dónde debo llamarlos?
Además, es posible que vea un impacto en el rendimiento si llama a esto en el constructor de su contexto ... Después de trasladar
EnsureCreated
a la utilidad setup.cs, noté mejoras considerables en mis tiempos de respuesta.
Nota: estoy usando EFC y UWP.
Con la información que proporcionaron James P y Bassam Alugili, lo que terminé haciendo fue agregar estas líneas de código al método
Configure
en la clase
Startup
(
Startup.cs
):
using (var scope =
app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
using (var context = scope.ServiceProvider.GetService<MyDbContext>())
context.Database.Migrate();
Solo como un avance, deberías leer this de Rowan Miller:
...
EnsureCreated
totalmente evita las migraciones y solo crea el esquema para usted, no puede mezclar esto con las migraciones.EnsureCreated
está diseñado para probar o crear prototipos rápidamente cuando está de acuerdo con soltar y volver a crear la base de datos cada vez. Si está utilizando migraciones y desea que se apliquen automáticamente al inicio de la aplicación, puede usarcontext.Database.Migrate()
lugar.
De acuerdo con la respuesta
here
, debe agregar
Globals.EnsureDatabaseCreated();
a
Startup.cs
:
Función de inicio en Startup.cs :
public Startup(IHostingEnvironment env)
{
// Set up configuration sources.
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables();
if (env.IsDevelopment())
{
// This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
builder.AddApplicationInsightsSettings(developerMode: true);
}
Configuration = builder.Build();
Globals.Configuration = Configuration;
Globals.HostingEnvironment = env;
Globals.EnsureDatabaseCreated();
}
Y defina
Globals.EnsureDatabaseCreated()
siguiente manera:
public static void EnsureDatabaseCreated()
{
var optionsBuilder = new DbContextOptionsBuilder();
if (HostingEnvironment.IsDevelopment()) optionsBuilder.UseSqlServer(Configuration["Data:dev:DataContext"]);
else if (HostingEnvironment.IsStaging()) optionsBuilder.UseSqlServer(Configuration["Data:staging:DataContext"]);
else if (HostingEnvironment.IsProduction()) optionsBuilder.UseSqlServer(Configuration["Data:live:DataContext"]);
var context = new ApplicationContext(optionsBuilder.Options);
context.Database.EnsureCreated();
optionsBuilder = new DbContextOptionsBuilder();
if (HostingEnvironment.IsDevelopment()) optionsBuilder.UseSqlServer(Configuration["Data:dev:TransientContext"]);
else if (HostingEnvironment.IsStaging()) optionsBuilder.UseSqlServer(Configuration["Data:staging:TransientContext"]);
else if (HostingEnvironment.IsProduction()) optionsBuilder.UseSqlServer(Configuration["Data:live:TransientContext"]);
new TransientContext(optionsBuilder.Options).Database.EnsureCreated();
}