Nella mia app ASP.NET Core ho DbContext che contiene due tipi di entità, ad esempio, Pupille e Classi. Voglio aggiungere una nuova classe, ottenere l'ID della nuova classe e aggiungere alla classe un nuovo allievo. Ho provato a farlo in questo modo:
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();
Tuttavia ho ricevuto l'errore sulla seconda chiamata a SaveChangesAsync ():
Microsoft.EntityFrameworkCore.DbContext: Errore: si è verificata un'eccezione nel database durante il salvataggio delle modifiche. System.InvalidOperationException: una seconda operazione avviata in questo contesto prima che fosse completata un'operazione precedente. Non è garantito che tutti i membri di istanza siano thread-safe.
Ho cercato di avvolgere tutto nella transazione in questo modo:
using (var transaction = Context.Database.BeginTransaction()) {
....
transaction.Commit();
}
Ma il problema persiste.
Qual è il modo corretto di eseguire due operazioni correlate in EF Core? È possibile fare in un'unica transazione?
PS: sto usando PostgreSQL con il provider Npgsql
Il problema è stato con l'utilizzo di DB da qualche altra parte poiché ASP.NET Core Dependency Injection crea solo una singola istanza di ciascun servizio. L'ho risolto creando un nuovo ambito
public MyService(IServiceProvider provider) { ... };
....
var Scope = provider.CreateScope();
var Context = Scope.ServiceProvider.GetService<ShellDbContext>();
Class.Id
è un campo autoincrement / sequence? Può essere EF sta interrogando DB per il suo valore dopo l'inserimento ... Prova ad aggiungere Console.WriteLine(Class.Id)
o Console.WriteLine(Class.Id)
await Context.Entry(Class).ReloadAsync()
dopo il primo salvataggio.