在Heroku中运行EF Core迁移

我目前正在.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感觉很不对,欢迎任何见识!

lugogogo 回答:在Heroku中运行EF Core迁移

经过不同的选择后,最简单/最简单的方法是在应用程序启动之前,以实际的应用程序代码运行迁移,并将其挂接到Webhost中。

通过创建扩展功能,例如:

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和所有工具。

本文链接:https://www.f2er.com/3078751.html

大家都在问