おーみんブログ

C#, ASP.NET Core, Unityが大好きです。

DbContextにおける並列処理の備忘録

はじめに

個人アプリでDbContextを用いて並列処理を扱う機会があったので備忘録として残します。

DbContextはスレッドセーフではない

docs.microsoft.com

DbContext はスレッドセーフではありません。 スレッド間でコンテキストを共有しないでください。 コンテキスト インスタンスの使用を継続する前に、すべての非同期呼び出しを必ず待機するようにしてください。

当初、DIコンテナのライフサイクルをSingletonで実装していたため、並列処理をした際に上記の内容で引っかかりました。
どうやらコンテキストの共有ができないとのことでライフサイクルをScopedに変更することで対処が出来ました。

container.Register(Of IGetTodosRepository, GetTodosRepository)(Lifestyle.Scoped)

おわりに

よくよく考えたらWebアプリ系を作る場合は複数のアクセスが発生するのでそもそもライフサイクルはScopedやTransientにしたほうがいいですね。。。
とはいえおかげでまた一つ勉強になりました!!