在EF Core中執行兩個相關操作

asp.net-core c# entity-framework entity-framework-core postgresql

在我的ASP.NET核心應用程序中,我有DbContext,它包含兩種類型的實體,比如,Pupils和Classes。我想添加一個新類,獲取新類的Id並在類中添加一個新的Pupil。我試著這樣做:

var Class = new Class{ name = "Math" };
Context.Classes.Add(Class);
await Context.SaveChangesAsync();
var Pupil = new Pupil{ name = "Rem", ClassId = Class.Id };
Context.Pupils.Add(Pupil);
await Context.SaveChangesAsync();

但是我在第二次調用SaveChangesAsync()時遇到錯誤:

Microsoft.EntityFrameworkCore.DbContext:錯誤:保存更改時數據庫中發生異常。 System.InvalidOperationException:在上一個操作完成之前,在此上下文中啟動了第二個操作。任何實例成員都不保證是線程安全的。

我試圖以這種方式將所有內容包裝在事務中:

using (var transaction = Context.Database.BeginTransaction()) {
    ....
    transaction.Commit();
}

但問題仍然存在。

在EF Core中執行兩個相關操作的正確方法是什麼?是否可以在單筆交易中完成?

PS:我正在使用PostgreSQL和Npgsql提供程序

一般承認的答案

問題是在其他地方使用DB,因為ASP.NET Core Dependency Injection僅創建每個服務的單個實例。我通過創建一個新的範圍解決了它

public MyService(IServiceProvider provider) { ... };
....

var Scope = provider.CreateScope();            
var Context = Scope.ServiceProvider.GetService<ShellDbContext>();

熱門答案

Class.Id是自動增量/序列字段嗎?可能是EF在插入後查詢DB的值...嘗試在首次保存後添加Console.WriteLine(Class.Id)await Context.Entry(Class).ReloadAsync()



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow