2017-02-13 19 views
-1

ライブ・ステージでエンティティ・フレームワーク(バージョン6)によってスローされた異なる例外を数日間記録しています。接続。 'のConnectionString' プロパティを変更することはできませんエンティティ・フレームワーク:時折異なる接続の問題が発生する

  • 。 接続の現在の状態は閉じられています。

  • モデルの作成中にコンテキストを使用することはできません。この コンテキストが のOnModelCreatingメソッドの内部で使用されている場合、または複数のスレッドが同時に によって同じコンテキストインスタンスにアクセスされている場合、例外がスローされることがあります。 DbContext のインスタンスメンバーおよび関連するクラスは、スレッドセーフであることは保証されていないことに注意してください。

  • 予期しない接続状態。ラッピングプロバイダを使用する場合、 は、StateChangeイベントがラップされたDbConnectionに実装されていることを確認してください。

  • オープンしているプロバイダは、失敗しました。

我々は何も変更し、既にこれらのエラーのみ時々起こる言ったことを覚えていないことができます。現地では再現できません。

誰かが間違っていることや調査方法を知っていますか?

編集:これは、インスタント化のためにUnity IoCを使用するASP.NET MVC 5アプリケーションです。私たちは、他のmvcアプリケーションでは絶対に滑らかに動作する自己記述PerRequestLifeTimeManagerを使用します。

+0

に沿ってすべてのステップは、あなたは、このエラーが表示されているコードの一部を共有することはできますか?エラーがポップアップするパターンやユースケースを特定できましたか?どのコード行に例外がスローされたかを示すアプリケーションログがありますか? –

+1

私はあなたが間違った方法で文脈を使っていると確信しています。おそらく静的メンバーとしてではありますが、確かにそれらが複数のスレッドからアクセスできるようになります。リファクタリング時間! –

+1

コードなしで言うことは不可能です。しかし、私は@GertArnoldに同意する傾向があります。リクエストごとにコンテキストインスタンスが1つだけ必要です。要求ごとに複数のインスタンスを新しく作成している場合や、逆に静的にまたはシングルトンなどを使用している場合は、問題が発生します。 –

答えて

1

@Gerd Arnoldと@Chris Prattのヒントのおかげで、私は自分の問題の根本原因を突き止めることができました。

実際には、複数の要求にまたがって同時に使用されたDbContextのインスタンスによって例外が発生します。このDbContextは、Unityプロパティの注入によってアクションフィルタに注入されるサービスの一部です。私がまだ分かっていなかったのは、アクションフィルタはAPS.NET MVCでリクエストごとにインスタンス化されませんが、キャッシュされて再利用されるということです。 DbContextまたはDbContextベースのクラスのインスタンスをアクションフィルタに挿入しないでください。

は、我々はDependencyResolver.Current.GetService<ClassType>()を呼び出す代わりに、(あなたがこの回避策により、フィルタのテスト容易性を失うことに注意してください)

それをそれぞれの依存関係のインスタンスを取得するために私たちのフィルタのコードでDependency -attributeを使用してその問題を解決しました解決策を見つけるまでに何時間もかかりました。私の質問で言及されているのと同じエラーに時々遭遇するこれらのユーザには、アプリケーション/スレッド間で同時に使用されるDbContextベースのクラスをアプリケーションでチェックすることをお勧めします。

  1. は、あなたのユニティのIoCルールのIoCを通じてインスタンス化されませんが、同時に使用されるかもしれないクラスについて
  2. ルックをチェックしてください。
  3. チェックMVC request lifecycle
関連する問題