2016-06-13 18 views
3

データベース要求に対してASP.NETコアとEF6を使用します。 潜在的に、複数のユーザーがデータベースで同時にアクセスできます。私はユニットテストで状況をマテリアライズド:複数の要求が同時に発生した場合の予期しない接続状態

Parallel.For(0, 10, count => { 
    result = userRepo.Sessions.Any(session => session.Token == token); 
}); 

例外がスローされます。Unexpected connection state. When using a wrapping provider ensure that the StateChange event is implemented on the wrapped DbConnection

これは私が完全に理解していることです:コードは同じ接続でデータベースにアクセスしようとしていますが、1つの要求が完了する前に接続が閉じられています。しかし、ASP.NET CoreとDependency Injectionを使用すると、2つの要求の間で同じ接続を共有できるため、上記のテストのようにクラッシュする可能性があります。 DIコンテナのデータベースサービスの登録にはAddScopedを使用します。

私のアーキテクチャには何かがありませんか?

+3

通常、dbcontextは要求ごとにスコープが設定され、各要求には独自の接続があり、スコープ外になり、要求の最後に配置されます。 –

+3

2つのリクエスト**は、(デフォルトで)スコープが設定されているため、**同じ接続を使用できません。 Scopedは、要求ごとに1つのDbContextインスタンスを作成します。あなたが試みているのは、ASP.NETコア要求がどのように機能するかではありません。ループの繰り返しごとに新しいユーザーリポジトリと新しいコンテキストをインスタンス化する必要があります。 Read:あなたの単体テストは単なる間違っています;) – Tseng

+3

複数のHTTP要求が 'DbContext'の同じインスタンスを使用している場合は間違っていました。この単体テストは、起こるべきではないシナリオをテストしています。 – David

答えて

0

多くの調査の結果、問題が見つかりました。 Entity Frameworkを介してデータベースにアクセスするC#ラムダ式全体をキャッシュしました。したがって、あるHTTP要求から別のHTTP要求へと、DbContextは同じでした。そのため、この例外がスローされました。

関連する問題