1

私は Entity Framework 5 Code First を使用しています。リポジトリと作業単位パターンを使用し、Windows Azure クラウド サービスで実行されている MVC アプリ内でドメイン モデル、リポジトリ、およびサービス レイヤーを正常に動作させています。Unity を IoC に使用しており、必要に応じてリポジトリ、コントローラー、およびサービス クラスを挿入し、要求ごとの有効期間を使用しています。それはうまく機能しています。

ただし、ドメイン、リポジトリ、および EF5 DbContext に同じコード/クラス ライブラリを Azure Worker ロールで使用し、MVC アプリと同じ SQL Azure データベースを指している場合、表示されない奇妙なエラーが発生します。 MVC アプリから。この時点では、読み取り (選択) のみを行っており、更新トランザクションは行っていないことに注意してください。以下のエラー メッセージは、接続を開けなかったことを示しているようです。

Worker ロールには、コンテナーを構築してすべてのサービスを登録するためのブートストラップ静的クラスがあります。worker ロールの起動では、いくつかの作業を行う必要があるため、ブートストラップを呼び出してサービスを登録し、すぐに使用できるようにそのうちのいくつかを解決します。これらのサービスにはリポジトリが挿入され、リポジトリには DbContext が挿入され、すべて IoC コンテナーによって構築されます。DbContext については、IoC コンテナーで Unity の HierarchicalLifeTimeManager を使用しています。

worker ロールの実行中にサービス クラスがデータベースからデータを読み取ろうとすると、次のエラーが発生します。

The underlying provider failed on Open.    at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)
   at System.Data.EntityClient.EntityConnection.Open()
   at System.Data.Objects.ObjectContext.EnsureConnection()
   at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
   at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at MyApp.Persistence.EF.RepositoryBase`1.Find(Expression`1 where, Expression`1[] includeProperties)

このまったく同じメソッド呼び出しは、MVC アプリから正常に機能しています。おそらくIoCの寿命に関連して、ワーカーロールのDbContextのスコープに何か問題があると思いますが、それは単なる推測です。

この例外の原因は何ですか? EF、IoC、Repos/UoW、および Azure Worker ロールを使用している人はいますか? 提案?

4

1 に答える 1

1

私の質問にコメントしてくれた Arthur Vickers に感謝します。先に進み、Azure SQL Database 接続による一時的なエラーまでこれをチョークで書きます。これを完全に証明することはできませんでしたが、Azure で SQL VM を立ち上げ、そこに DB を作成し、代わりにクラウド サービス アプリを変更してその DB を指すようにしました。

ログを監視しており、同じ問題はまだ見られていません...

Azure SQL Db に戻った場合の考えられるオプションの 1 つは、Microsoft P&P の Transient Fault Handling ブロックを使用して独自の再試行ロジックを展開するか、Rob Moore の ReliableDbProvider ( https://github.com/robdmoore/ReliableDbProvider ) のようなプロジェクトを使用することです。

EF6 が登場したら、一時的なエラーに対する組み込み機能の使用を検討します。

これが他の誰かに役立つことを願っています。

于 2013-07-16T15:17:12.287 に答える