【问题标题】:Where to call EF Core Migrate in web API startup class?在 Web API 启动类中在哪里调用 EF Core Migrate?
【发布时间】:2020-10-21 14:28:06
【问题描述】:

我正在尝试在 Azure 托管的 Web API 中在应用程序启动期间处理数据库迁移。但是,无论我尝试将它放在哪里,都会出现异常:

ObjectDisposedException: Cannot access a disposed object.

我认为这是因为我在注入过程的错误部分将上下文迁移调用包装在“使用”语句中。但我不确定它应该放在哪里。

我查阅了以下文章:

并尝试了以下迁移位置:

public Startup(IConfiguration appSettings)
{
  using var dbContext = new MyContext();
  dbContext.Database.Migrate();
}

这在 MyContext 上产生了 ObjectDisposedException。因此,我尝试将其从构造函数中移除并将其添加到服务中并将其注入到配置调用中(根据第一篇和第二篇文章):

public Startup(IConfiguration appSettings)
{
}
public void ConfigureServices(IServiceCollection services)
{
  services.AddDbContext<MyContext>();
  [...]
}
public void Configure(IApplicationBuilder app, 
  IWebHostEnvironment env, MyContext dbcontext)
{
  [...]
  dbcontext.Database.Migrate();
}

这也会在 MyContext 上产生 ObjectDisposedException。所以我尝试改变 configure 方法访问上下文服务的方式(根据第三篇文章):

public Startup(IConfiguration appsettings)
{
}
public void ConfigureServices(IServiceCollection services)
{
  services.AddDbContext<MyContext>();
  [...]
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
  [...]
  using var serviceScope = app.ApplicationServices
    .GetRequiredService<IServiceScopeFactory>()
    .CreateScope();
  using var context = serviceScope.ServiceProvider
    .GetService<MyDbContext>();
  context.Database.Migrate();
}

这仍然在 MyContext 上产生 ObjectDisposedException。

如果能帮助我理解我在尝试实施此 EF Core 迁移时做错了什么,我将不胜感激!谢谢!

【问题讨论】:

    标签: entity-framework-core asp.net-core-webapi ef-core-3.0


    【解决方案1】:

    如果您了解使用具有更改数据库架构权限的连接字符串的安全风险,并且您了解当您的应用的多个实例尝试同时迁移数据库时可能出现的问题...

    您可以在 Program.Main 中执行此操作。如果您使用的是 Microsoft.Extensions.Hosting,它将如下所示:

    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
    
        using (var scope = host.Services.CreateScope())
        {
            var db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
            db.Database.Migrate();
        }
    
        host.Run();
    }
    

    您还可以考虑添加一个管理页面,要求用户在单击按钮迁移数据库之前进行身份验证。

    【讨论】:

      猜你喜欢
      • 2021-11-20
      • 1970-01-01
      • 2018-11-09
      • 2018-05-08
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 2014-07-11
      相关资源
      最近更新 更多