質問: > **tl; dr** DbContextはスレッドセーフではありませんが、マルチスレッドの.NET Core APIアプリケーションでEntity Frameworkを使用するにはどうすればよいですか? > > ### 環境 私は、データベースにアクセスしてそこからデータを読み取るいくつかのRESTfulインターフェイスを公開すると同時に、他のWebサービスからデータを定期的にポーリングし、データベースに保存するバックグラウンド作業スレッドとして、.NET Core APIアプリに取り組んでいます。 DbContextはスレッドセーフではないという事実を知っています。 Stackoverflowで多くのドキュメント、ブログ投稿、回答をここで読みました。DIで作業しているとき、これに関する多くの(部分的に矛盾する)回答を見つけることができましたが、実際の「ベストプラクティス」は見つかりませんでした。 ### 試したこと `AddDbContext`拡張メソッドを介してデフォルトの`ServiceLifetime.Scoped`を使用すると、競合状態による例外が発生します。 明らかな欠点があるため、ロック(たとえば、セマフォ)を使用したくありません。 * コードはロックで汚染され、ロックを安全に解除するためにtry / catch / finallyになります * つまり、DbContextにアクセスする領域をロックするのを忘れた場合など、「堅牢」とは思えません。 * 同時接続とアクセスも処理するデータベースを操作する場合、アプリ内のdbアクセスを人為的に同期することは冗長で「不自然」です 注入ない`MyDbContext`が、 `DbContextOptions`私はDBにアクセスする必要がある場合に代わりに、唯一のコンテキストを構築し、使用して`using` immediatelly読み取り/書き込みの後に、それを配置する文では、リソース使用量のオーバーヘッドと不必要に多くの接続口/閉鎖の多くのように思えます。 ### 質問 私は本当に困惑しています:これをどのように達成できますか? 私のユースケースは特別なものではないと思います-バックグラウンドワーカーからデータベースにデータを入力し、Web APIレイヤーからクエリする-ef coreでこれを行う有意義な方法があるはずです。 どうもありがとう!
回答: `TimedHostedServices`がトリガーされるたびにスコープを作成する必要があります。 コンストラクターにサービスプロバイダーを挿入します。 ``` public MyServiceService(IServiceProvider services) { _services = services; } ``` タスクがトリガーされるたびにスコープを作成します ``` using (var scope = _services.CreateScope()) { var anotherService = scope.ServiceProvider.GetRequiredService(); anotherService.Something(); } ``` より完全な例はドキュメントで利用可能です