Migraciones automáticas de EntityFramework Core

¿Hay algún código para realizar la migración automática en el code first Entity Framework core code first en el proyecto principal asp.net?

Lo hago simplemente en MVC4 / 5 agregando

 Database.SetInitializer(new MigrateDatabaseToLatestVersion()); public Configuration() { AutomaticMigrationsEnabled = true; } 

Esto ahorra tiempo cuando las entidades cambian

Puede llamar context.Database.Migrate() en su Startup.cs

p.ej:

 using (var context = new MyContext(...)) { context.Database.Migrate(); } 

EF core no admite automatic migrations . Por lo tanto, debe hacerlo manualmente.

Desde la perspectiva de las migraciones automáticas como una característica, no estamos planeando implementarlo en EF Core ya que la experiencia ha demostrado que las migraciones basadas en códigos son un enfoque más manejable.

Puede leer la historia completa aquí: No implementar Migraciones automáticas

Esta es la forma en que lo hacen en IdentityServer4 http://identityserver.io

 public void ConfigureServices(IServiceCollection services) { var connectionString = Configuration.GetConnectionString("DefaultConnection"); var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name; // Add framework services. services.AddDbContext(options => options.UseSqlServer(connectionString)); ... } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { // this will do the initial DB population InitializeDatabase(app); } private void InitializeDatabase(IApplicationBuilder app) { using (var scope = app.ApplicationServices.GetService().CreateScope()) { scope.ServiceProvider.GetRequiredService().Database.Migrate(); scope.ServiceProvider.GetRequiredService().Database.Migrate(); ... } } 

Siguiendo la documentación de Microsoft

https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro

Si está utilizando la dependency injection, primero debe configurar una clase estática Data / DbInitializer.cs y agregar el siguiente código:

 public static class DbInitializer { public static void Initialize(ApplicationDbContext context) { context.Database.Migrate(); // Add Seed Data... } } 

Tenga en cuenta que aquí también puede agregar datos de inicialización.

Luego, en su archivo Program.cs, agregue el siguiente código

 public static void Main(string[] args) { var host = BuildWebHost(args); using (var scope = host.Services.CreateScope()) { var services = scope.ServiceProvider; try { var environment = services.GetRequiredService(); if (!environment.IsDevelopment()) { var context = services.GetRequiredService(); DbInitializer.Initialize(context); } } catch (Exception ex) { var logger = services.GetRequiredService>(); logger.LogError(ex, "An error occurred while seeding the database."); } } host.Run(); } 

En mi caso, estoy revisando el entorno para asegurarme de que estoy en desarrollo para poder controlar las migraciones / actualizaciones. Sin embargo, en producción, quiero que sean automáticos para una integración continua. Como otros lo han mencionado, probablemente esta no sea la mejor práctica, pero en proyectos pequeños funciona muy bien.

Las migraciones automáticas no son compatibles con EF Core. La migración es necesaria para crear manos. Para aplicar automáticamente todas las migraciones hechas a mano existentes, debe agregar el siguiente código en el DbContext:

 public sealed class MyDbContext : DbContext { private static readonly bool[] _migrated = { false }; public MyDbContext( DbContextOptions options ) : base( options ) { if ( !_migrated[0] ) lock ( _migrated ) if ( !_migrated[0] ) { Database.Migrate(); // apply all migrations _migrated[0] = true; } } 

No es elegante, pero funciona.

Actualización para EFCore 2.1:

 public class Program { public static void Main(string[] args) { var host = CreateWebHostBuilder(args).Build(); using (var scope = host.Services.CreateScope()) { var services = scope.ServiceProvider; try { var context = services.GetRequiredService(); context.Database.Migrate(); // apply all migrations SeedData.Initialize(services); // Insert default data } catch (Exception ex) { var logger = services.GetRequiredService>(); logger.LogError(ex, "An error occurred seeding the DB."); } } host.Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup(); } 

}

Mi código de automatización de trabajo Asp Net Core 2.0.7.

  // startup.cs public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // configure app SeedData.Initialize(app.ApplicationServices); } // dbInitializer.cs public static class SeedData { public static void Initialize(IServiceProvider serviceProvider) { using (var serviceScope = serviceProvider.CreateScope()) { var context = serviceScope.ServiceProvider.GetService(); // auto migration context.Database.Migrate(); // Seed the database. InitializeUserAndRoles(context); } } private static void InitializeUserAndRoles(ApplicationDbContext context) { // init user and roles } } 

mi mejor consejo es no utilizar la migración automática. Siempre es mejor agregar migraciones manualmente y también evitar la migración masiva y seguir las mejores prácticas para usar la migración manual

la migración automática no es una herramienta mágica y habrá varias ocasiones en las que es posible que desee agregar algunos cambios adicionales a la migración. Solo lo logra usando la migración manual.

Para habilitar la migración, escriba “enable-migrations” en la consola del administrador de paquetes

De esta forma, tendrá el control total de la actualización o degradación de su base de datos y también será fácil realizar un seguimiento de las migraciones.

Solo tres sencillos pasos en la consola del administrador de paquetes.

1) add-migrations [algún nombre para su migración]

2) se generan migraciones para los cambios, los revisa y también puede realizar cambios en él

3) actualización de la base de datos, su migración está completa ahora.

¡manejar la migración es menos doloroso!