![](/img/trans.png)
[英]"Cannot access a disposed context" when trying to access EF Core DbContext in Startup ExceptionHandler
[英]Getting "'Cannot access a disposed object" error when trying to update database on startup using EF Core in Web API Core
我們有一個 Web API Core 應用程序,它在后端使用 EF Core 和 SQL Server。 我試圖在 Web API 服務啟動時更新其中一個數據庫表(在 Startup.cs 配置方法中)
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, SomeDBContext dataContext, ILoggerFactory loggerFactory)
{
.......................
// Automatically perform database migration
dataContext.Database.Migrate();
PopulateSomeTable(dataContext);
}
private async void PopulateSomeTable(SomeDBContext context)
{
var someTables = context.SomeTables;
if (someTables != null && (await someTables .CountAsync()) == 0)
{
someTables .Add(new Entities.SomeTable
{
someProperty1= 20,
someProperty2 = "Something",
someProperty3 = DateTimeOffset.Now,
});
await context.SaveChangesAsync();
}
}
但是,當我嘗試訪問上下文時,出現此錯誤
無法訪問已處置的對象。 此錯誤的一個常見原因是處理從依賴注入解析的上下文,然后嘗試在應用程序的其他地方使用相同的上下文實例。 如果您在上下文上調用 Dispose() 或將上下文包裝在 using 語句中,則可能會發生這種情況。 如果你使用依賴注入,你應該讓依賴注入容器來處理上下文
我該如何解決?
先感謝您
從啟動中刪除所有代碼,這不是進行數據庫遷移的最佳位置,只添加此代碼
public static void Configure(IApplicationBuilder app, IWebHostEnvironment env, MyDbContext context)
{
if (env.IsDevelopment())
{
context.Database.EnsureCreated();
}
}
將此代碼添加到啟動的ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddNewtonsoftJson(options =>
options.SerializerSettings.ContractResolver =
new CamelCasePropertyNamesContractResolver());
services.AddDbContext<SomeDBContext (options =>
options.UseSqlServer(Configuration.GetConnectionString("CategoryDbConnection")));
填充數據添加這樣的代碼 OnModelCreating of SomeDBContext
modelBuilder.Entity<SomeTable>().HasData(
new SomeTable{ ....
});
將類遷移到數據庫表,請點擊此鏈接https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=vs
您需要將private async void PopulateSomeTable(SomeDBContext context)
替換為private async Task PopulateSomeTable(SomeDBContext context)
。 將async void
替換為async task
。 查看此鏈接以獲取更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.