簡體   English   中英

嘗試使用 Web API Core 中的 EF Core 在啟動時更新數據庫時出現“無法訪問已處理的對象”錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM