我們有一個 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 陳述句中,則可能會發生這種情況。如果你使用依賴注入,你應該讓依賴注入容器來處理背景關系
我該如何解決?
先感謝您
uj5u.com熱心網友回復:
您需要替換private async void PopulateSomeTable(SomeDBContext context)為private async Task PopulateSomeTable(SomeDBContext context). 替換async void為async task。查看此鏈接以獲取更多資訊。
uj5u.com熱心網友回復:
從啟動中洗掉所有代碼,這不是進行資料庫遷移的最佳位置,只添加此代碼
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/340361.html
標籤:C# 依赖注入 实体框架核心 asp.net-core-webapi
