繁体   English   中英

在 Heroku 中运行 EF Core 迁移

[英]Running EF Core migrations in Heroku

我目前正在 .NET Core 中开发原型,为了简单起见,我使用了 Docker/Heroku。

我注意到的是,当尝试通过heroku dotnet run ef database update运行迁移时, dotnet CLI 不可用。 我很快注意到这是因为我的最终图像只有运行时,而不是 sdk。 我的问题是:为了能够运行迁移,同时让更轻的图像只运行运行时,什么才是最有意义的? 我是否因为只有运行时而变得很重要?

这就是我当前的图像,以便能够像我现在一样运行迁移:

FROM mcr.microsoft.com/dotnet/core/sdk:3.0
WORKDIR /app
COPY --from=build-env /app/out ./

RUN dotnet tool install --global dotnet-ef

# Set ASPNETCORE_URLS to run the app on the port Heroku exposes.
# Kestrel run by default on 5000/1 and Heroku doesn't allow that.
CMD ASPNETCORE_URLS=http://*:$PORT dotnet Lazarus.dll

我同时拥有 SDK 并且必须在生产映像中安装 EF CLI 只是感觉不对,所以欢迎任何见解!

在尝试了不同的选项之后,最简单/最简单的方法是在启动应用程序连接到 webhost 之前运行迁移,在实际的应用程序代码中。

通过创建扩展 function 例如:

public static IWebHost MigrateDatabase<T>(this IWebHost webHost) where T : DbContext
{
    using(var scope = webHost.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        try
        {
            var db = services.GetRequiredService<T>();
            db.Database.Migrate();
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while migrating the database.");
        }
    }
    return webHost;
}

它可以在主入口点中使用,如下所示:

public static void Main(string[] args)
{
    CreateWebHostBuilder(args)
        .Build()
        .MigrateDatabase<DatabaseContext>()
        .Run();
}

虽然它不会将迁移作为部署过程的一部分运行,但作为启动过程的一部分,我觉得它更容易并且需要更少的移动部件才能开始。 这也允许发布一个更小的镜像,它只包含运行时而不是 SDK 以及所有工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM