質問: ここ数日で、ライブステージ上にエンティティフレームワーク(バージョン6)によって投げられた異なる例外を記録しています。このステージはたまにしか発生せず、エラーメッセージを表示します。これらはすべてデータベース接続に関連しています。 > * 'ConnectionString'プロパティを変更することはできません。接続の現在の状態は閉じられています。 > * モデルの作成中にコンテキストを使用することはできません。この例外は、コンテキストがOnModelCreatingメソッド内で使用されている場合、または同じコンテキストインスタンスが複数のスレッドによって同時にアクセスされる場合にスローされる可能性があります。 DbContextおよび関連するクラスのインスタンスメンバーは、スレッドセーフであることが保証されていないことに注意してください。 > * 予期しない接続状態。ラッピングプロバイダを使用する場合は、ラップされたDbConnectionでStateChangeイベントが実装されていることを確認してください。 > * 基礎となるプロバイダがOpenで失敗しました。 > 我々は何かを変えたことを覚えていない。現地では再現できません。 誰が何がうまくいかないのか、どのように調査するのか考えている人はいますか? **編集:**これは、インスタント化のためにUnity IoCを使用するASP.NET MVC 5アプリケーションです。私たちは、他のmvcアプリケーションでは絶対に滑らかに動作する自己記述PerRequestLifeTimeManagerを使用します。
回答: @Gerd Arnoldと@Chris Prattのヒントのおかげで、私は自分の問題の根本原因を突き止めることができました。 実際には、複数の要求に対して同時に使用されたDbContextのインスタンスによって例外が発生しました。このDbContextは、Unityプロパティの注入によってアクションフィルタに注入されるサービスの一部です。私がまだ分かっていなかったのは、アクションフィルタはAPS.NET MVCでリクエストごとにインスタンス化されませんが、キャッシュされて再利用されるということです。 **したがって、DbContextまたはDbContextベースのクラスのインスタンスをアクションフィルタに挿入しないでください。** この問題は、フィルタのコードで`Dependency` -attributeを使用する代わりに、 `DependencyResolver.Current.GetService()`呼び出すことで解決しました。この`Dependency`のインスタンスを取得します(この回避策を使用してフィルタのテスト容易性を失うことに注意してください) 解決策を見つけるまで数時間を要した。私の質問で言及されているのと同じエラーに時々遭遇するこれらのユーザには、アプリケーション/スレッド間で同時に使用されるDbContextベースのクラスをアプリケーションでチェックすることをお勧めします。 1. Unity IoCルールを確認する 2. IoCでインスタンス化されないクラスは、同時に使用される可能性があります。 3. MVCリクエストライフサイクルに沿ったすべてのステップを確認する