【发布时间】:2020-10-21 14:28:06
【问题描述】:
我正在尝试在 Azure 托管的 Web API 中在应用程序启动期间处理数据库迁移。但是,无论我尝试将它放在哪里,都会出现异常:
ObjectDisposedException: Cannot access a disposed object.
我认为这是因为我在注入过程的错误部分将上下文迁移调用包装在“使用”语句中。但我不确定它应该放在哪里。
我查阅了以下文章:
- ASP - Core Migrate EF Core SQL DB on Startup
- https://jasonwatmore.com/post/2019/12/27/aspnet-core-automatic-ef-core-migrations-to-sql-database-on-startup
- https://blog.rsuter.com/automatically-migrate-your-entity-framework-core-managed-database-on-asp-net-core-application-start/
并尝试了以下迁移位置:
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