c# - 有没有办法在托管服务启动之前运行实体框架迁移
问题描述
创建 .NET Core 5 应用程序时,我通过在 Startup.Configure (...) 方法顶部执行迁移代码来运行 EF 迁移:
public class Startup
{
. . .
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
using (var scope = app.ApplicationServices.CreateScope())
{
ApplicationDbContext context = scope.ServiceProvider.GetService<ApplicationDbContext>();
context.Database.Migrate();
}
. . .
}
}
这一切都运行良好,直到我最近添加了一些依赖于数据库的托管服务和迁移应用的更改。现在,如果我有需要在托管服务启动之前应用的迁移,我的应用程序会在启动时崩溃,因为托管服务在迁移运行之前启动。
有没有办法来解决这个问题?有没有办法在托管服务启动之前运行迁移?
解决方案
经过一番折腾,这个解决方案似乎有效,虽然我对 .NET Core Framework 的了解还不够,无法确定这是否会成为问题:
public class Program
{
public static void Main(string[] args)
{
IHost host = CreateHostBuilder(args).Build();
IServiceScopeFactory scopeFactory = host.Services.GetService<IServiceScopeFactory>();
using (var scope = scopeFactory.CreateScope())
{
ApplicationDbContext context = scope.ServiceProvider.GetService<ApplicationDbContext>();
context.Database.Migrate();
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddConsole();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
推荐阅读
- node.js - 无法让 VSCode 调试与我的 NodeJs 应用程序一起使用
- javascript - 如果我选择其他 React Router 会改变状态?
- android - 如何每秒刷新一次视图
- excel - Excel - 批量删除相同的单词和不同括号内容的其余部分
- c# - 使用“禁止”列表禁止列表中的变量
- emacs - Emacs 函数崩溃
- apache-spark - 不可序列化的结果:使用 Spark / Scala 读取序列文件时的 org.apache.hadoop.io.IntWritable
- r - 防止在ggplot2中居中多层标题
- linux - 对 mkfifo 的并发写入似乎丢失了
- matlab - 如何在 Matlab 中使用其他结构的一部分创建结构?