我目前正在.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感觉很不对,欢迎任何见识!
答案 0 :(得分:1)
经过不同的选择后,最简单/最简单的方法是在应用程序启动之前,以实际的应用程序代码运行迁移,并将其挂接到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和所有工具。