2016-10-28 16 views
2

どのようにdbcontext.SaveChanges()に困惑しています。ドキュメントに基づいて、SaveChanges()はデータベースに加えられたすべての変更を保存する必要があります。。複数の非同期関数中の.Net EFコアDbContext.Save()

私は、それらがすべて異なるテーブルを対象とする複数の非同期関数を持っている場合を考えてみましょう。それらのすべてが新しいエントリを作成しようとするが、他のものより時間がかかる場合(計算処理などによる)、dbcontext.SaveChanges()に到達する最初の関数は、それらの関数がSaveChangesの部分に達しても、 ?

私の心配は、複数のAsync関数中に、別の関数がSaveChanges()を呼び出したという理由だけで、BusinessFlowの前にデータが保存されるということです。

この場合、または非同期ごとに内部トランザクションスコープを作成しますか? Startup.csがここhttps://github.com/drakoumel/DatacircleAPI/blob/master/Startup.cs

+3

複数のスレッドから同じdbContextインスタンスを使用していて、複数のSaveChangesを並列に実行している場合は、そのようにしないでください。複数のスレッドから同じコンテキストを使用しないでください。並列操作ごとに個別のコンテキストを作成してください。 – Evk

+0

私は起動時にdbcontextを作成するweb APIを持っています。コントローラアクションが呼び出されるたびに同じ接続であるかどうかわかりません。 – Drakoumel

+0

私たちにあなたのコードを教えてください。特に、DbContextの注入/使用方法。私は@ Evkに同意した。 DBConextを適切な方法で注入している場合は、問題はありません。トランザクションはDbContextの各インスタンスで自動的に作成されるため、スレッドごとに新しいインスタンスを作成することが重要です。実際には、各スレッドにDBContextを挿入すると完了します。 –

答えて

2

を見つけることができます

そう振る舞うことどのようにすべてを理解するために、あなたはあなたのコンテキストを寿命がとリポジトリはDIコンテナに登録されている方法とを知っておく必要があります。

コンテキストは次のように登録されている:あなたはAddDbContextメソッドの引数を見ていきます場合は、あなたがServiceLifetime.Scopedのデフォルト値で、それはcontextLifetime引数を持っていることがわかります

services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(Configuration["ConnectionStrings:DefaultConnection"])); 

。そのため、コンテキストはScopedの有効期間に登録されます。

リポジトリもスコープ寿命で、だから、

services.AddScoped<IDatasourceRepository, DatasourceRepository>(); 

として登録されています。 有効期間はどのような意味ですか? DIコンテナで解決するときに、要求ごとに新しいオブジェクトが作成されたことを意味します。これで、リポジトリの単一インスタンスとコンテキスト(リクエストあたり)が存在することがわかりました。コントローラのアクションに対する別のコールでは異なるコンテキストのインスタンスが使用されるため、SaveChangesは相互に干渉することはありません。

+0

ああ、私はAddDbContextがデフォルトでScopedになったことを知りませんでした。 100万人のありがとう! – Drakoumel

関連する問題