gpt4 book ai didi

c# - 在 Heroku 中运行 EF Core 迁移

转载 作者:行者123 更新时间:2023-12-04 12:41:20 26 4
gpt4 key购买 nike

我目前正在 .NET Core 中开发原型(prototype),为了简单起见,我选择了 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 的应用程序启动之前运行迁移。

通过创建扩展函数,例如:

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

关于c# - 在 Heroku 中运行 EF Core 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58920607/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com