1

私のASP.NETコアアプリケーションでは、2つのタイプのエンティティ、たとえば生徒とクラスを含むDbContextがあります。新しいクラスを追加し、新しいクラスのIDを取得してクラスに新しい瞳孔を追加したいと思います。 私は、このようにそれを実行しようとしました:EFコアで2つの関連する操作を実行します

:私はトランザクションのすべてをこのようにラップしようとした

Microsoft.EntityFrameworkCore.DbContext:Error: An exception occurred in the database while saving changes. System.InvalidOperationException: A second operation started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.

:私はSaveChangesAsync()に2番目の呼び出しでエラーが発生しましたが

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(); 

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

しかし、問題は解決しません。

EFコアで2つの関連操作を実行する正しい方法は何ですか?単一の取引で行うことは可能ですか?

PS:ASP.NETコア依存性の注入は、各サービスの単一インスタンスのみを作成するので、私はNpgsqlのプロバイダ

+1

'(Context.SaveChangesAsync()'の返り値を代入して何かするとどうなりますか?再び、盲目の推測... –

+0

また、あなたは 'await'を呼び出していてASP.NET Coreを使用しています。つまり、このコードが実行されたときにコントローラーアクションを実行しています。 –

+0

Ops、間違った推測 - それは動作しません。はい、私は使用しています。 – Rem

答えて

0

ではPostgreSQLを使用している問題は、どこか別のDBを使用していました。自動インクリメント/シーケンスフィールドは 私は

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

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

Class.Id新しいスコープを作成することによって、それを解決しているのですか? EFが挿入後に値をDBに照会している可能性があります...初めて保存した後にConsole.WriteLine(Class.Id)またはawait Context.Entry(Class).ReloadAsync()を追加してみてください。

関連する問題