[英]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.