entity-framework - update - migration script entity framework




Migrações automáticas do EntityFramework Core (6)

Existe algum código para executar a migração automática no code first Entity Framework core code first no projeto principal do asp.net?

Eu faço isso simplesmente no MVC4 / 5 adicionando

Database.SetInitializer(new MigrateDatabaseToLatestVersion<AppDbContext, MyProject.Migrations.Configuration>());
public Configuration() {
          AutomaticMigrationsEnabled = true;
        }

Isso economiza tempo quando as entidades são alteradas


É assim que eles fazem no 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<ApplicationDbContext>(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<IServiceScopeFactory>().CreateScope())
    {
        scope.ServiceProvider.GetRequiredService<ApplicationDbContext>().Database.Migrate();
        scope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
        ...
    }
}

Meu código de automação de trabalho 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<ApplicationDbContext>();

                // auto migration
                context.Database.Migrate();

                // Seed the database.
                InitializeUserAndRoles(context);
            }
        }

        private static void InitializeUserAndRoles(ApplicationDbContext context)
        {
            // init user and roles  
        }
    }

O núcleo da EF não suporta automatic migrations . Portanto, você deve fazer isso manualmente.

Da perspectiva das migrações automáticas como um recurso, não estamos planejando implementá-lo no EF Core, pois a experiência mostrou que as migrações baseadas em código são uma abordagem mais gerenciável.

Você pode ler a história completa aqui: Não implementar Migrações Automáticas


Seguindo a documentação da Microsoft

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

Se você estiver usando injeção de dependência, primeiro precisará configurar uma classe estática Data / DbInitializer.cs e adicionar o seguinte código:

public static class DbInitializer
{
    public static void Initialize(ApplicationDbContext context)
    {
        context.Database.Migrate();

        // Add Seed Data...
    }
}

Observe que também é aqui que você pode adicionar dados iniciais.

Em seguida, no seu arquivo Program.cs, adicione o seguinte 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<IHostingEnvironment>();

                if (!environment.IsDevelopment())
                {
                    var context = services.GetRequiredService<ApplicationDbContext>();
                    DbInitializer.Initialize(context);
                }
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred while seeding the database.");
            }
        }

        host.Run();
    }

No meu caso, estou verificando o ambiente para garantir que estou em desenvolvimento para poder controlar as migrações / atualizações. No entanto, na produção, quero que eles sejam automáticos para integração contínua. Como outros já mencionaram, essa provavelmente não é uma prática recomendada, mas em pequenos projetos ela funciona muito bem.


Você pode chamar context.Database.Migrate() em seu Startup.cs

por exemplo:

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

meu melhor conselho é não usar a migração automática. É sempre melhor adicionar migrações manualmente e também evitar a migração em massa e seguir as práticas recomendadas para usar a migração manual.

a migração automática não é uma ferramenta mágica e haverá várias ocasiões em que você poderá adicionar algumas alterações adicionais à migração. Você só consegue usando a migração manual.

Para habilitar a migração, digite "enable-migrations" no console do gerenciador de pacotes

Dessa forma, você terá controle total da atualização ou desatualização do banco de dados e também será fácil rastrear migrações.

Apenas três etapas simples no console do gerenciador de pacotes.

1) adicionar migrações [algum nome para sua migração]

2) migrações são geradas para as alterações, você as revisa e também pode fazer alterações

3) atualização do banco de dados, sua migração está concluída agora.

lidar com a migração é menos doloroso!





entity-framework-core