tutorial onmodelcreating net mvc framework first español code asp asp.net asp.net-mvc entity-framework entity-framework-core

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:

  1. Consola del administrador de paquetes:

    Enable-Migrations -EnableAutomaticMigrations. Add-Migration / Update-Database.

  2. 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:

  1. Consola del administrador de paquetes:

    Update-Database -TargetMigration

  2. 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 usar context.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(); }

Para usar context.Database.Migrate() ver here o here .