Применение миграций в Docker контейнере C#
Такой вопрос, выпустил приложение(Web Api) такой командой dotnet publish -c Release -r linux-x64 --self-contained
Создалась папка publish, в котором всё приложение. Но в приложении у меня используется Entiry Framework Core, соответственно на этапе разработки я разворачивал Postresql в контейнере, создавал и применял миграции. Но надо ли их создавать и применять внутри контейнера после выпуска приложения?
Условно находясь в папке publish внутри контейнера написать команды по созданию и применению миграций. Но ведь для создания миграций EF Core требует файл .csproj , а его нет в папке сборки проекта
Ответы (1 шт):
Привет я использую такой метод расширения
using Microsoft.EntityFrameworkCore;
using PostService.Infrastructure.Context;
namespace PostService.Host.Extensions;
/// <summary>
/// Методы расширения для класса <see cref="WebApplication"/>.
/// </summary>
public static class WebApplicationExtensions
{
/// <summary>
/// Применение миграции к бд.
/// </summary>
/// <param name="webApplication"><see cref="WebApplication"/>.</param>
public static void ApplyMigrations(this WebApplication webApplication)
{
using var scope = webApplication.Services.CreateScope();
var context = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
var pendingMigrations = context.Database.GetPendingMigrations();
if (pendingMigrations.Any())
{
context.Database.Migrate();
Console.WriteLine("--> Migration apply");
}
}
}
И вызываю его в Program.cs
var app = builder.Build();
if (builder.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("swagger/v1/swagger.json", "v1");
options.RoutePrefix = string.Empty;
});
}
app.ApplyMigrations(); // Тут вызов
app.AddPostEndpoints();
app.Run();