在應用程式啟動資料庫種子期間使用範圍服務

在應用程式啟動期間解決作用域服務可能很困難,因為沒有請求,因此沒有作用域服務。

通過 app.ApplicationServices.GetService<AppDbContext>() 在應用程式啟動期間解決作用域服務可能會導致問題,因為它將在全域性容器的範圍內建立,有效地使其成為應用程式生命週期的單例,這可能會導致像 Cannot access a disposed object in ASP.NET Core when injecting DbContext 這樣的異常。

以下模式通過首先建立新作用域然後從中解析作用域服務來解決問題,然後在完成工作後,處理作用域容器。

public Configure(IApplicationBuilder app)
{
    // serviceProvider is app.ApplicationServices from Configure(IApplicationBuilder app) method
    using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
    {
        var db = serviceScope.ServiceProvider.GetService<AppDbContext>();

        if (await db.Database.EnsureCreatedAsync())
        {
            await SeedDatabase(db);
        }
    }
}

這是實體框架核心團隊在應用程式啟動期間播種資料的半官方方式,並反映在 MusicStore 示例應用程式中。