Автоматически выполнять миграции при публикации приложения 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 4, у меня есть дополнительные параметры базы данных:
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();
}
}
}