Автоматически выполнять миграции при публикации приложения ASP.NET Core

Вопрос

Есть ли способы автоматического выполнения кода миграции (EF 7) при публикации приложения ASP 5 в IIS с использованием Web Deploy?

Я старался

  • в project.jsonЯ добавил этот код в scripts:

    "scripts" : { "prepublish": ["dnx ef database update", "other commands..."], "postpublish": ["dnx ef database update"] }

никто не работал для меня.

Дополнительная информация

Я следовал инструкциям по этой ссылке для развертывания моего веб-приложения ASP 5 RC-1 в IIS с использованием веб-развертывания.

После этого в настройках публикации у меня есть:

Публикация ASP 5 RC 1 в IIS с использованием Web Deploy

Используя веб-развертывание в приложениях ASP 4, у меня есть дополнительные параметры базы данных:

Публикация ASP 4 в IIS с использованием Web Deploy

5 ответов

Решение

Поэтому я добавил опцию -environment к моему ef database команда. Теперь это работает:

"postpublish": ["dnx ef database update -e Staging"]

У меня четыре разных appsettings.json какие разные строки подключения для каждой среды. Просто нужно указать среду для работы команды.

Используйте context.Database.Migrate()

Вы можете позвонить с вашего Startup учебный класс:

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

Он перенесет вашу базу данных в последнюю версию при запуске приложения. Но будьте осторожны, возможно, закомментируйте этот код и отмените комментирование только тогда, когда вы хотите запустить миграцию.

Видимо, этот процесс не работает сейчас. https://github.com/aspnet/Home/issues/622 После публикации вы должны найти скрипт Power Shell с именем "имя профиля"-publish.ps1. Затем добавьте свои команды ниже этих трех строк ближе к концу этого файла. Возможно, вы захотите использовать powershell, чтобы упростить отладку.

'Calling Publish-AspNet' | Write-Verbose

# вызвать Publish-AspNet для выполнения операции публикации

Publish-AspNet -publishProperties $publishProperties -packOutput $packOutput

В вашем классе Startup.cs добавьте этот код

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

.Net6 или выше

Я использую следующий код, и он отлично работает для меня

      
using (var scope = builder.Services.BuildServiceProvider().CreateScope())
{
    using(var dbContext = scope.ServiceProvider.GetRequiredService<YourDbContext>())
    {
        if (dbContext.Database.GetPendingMigrations().Any())
        {
            dbContext.Database.Migrate();
        }
    }
}