私は 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 ロールを使用している人はいますか? 提案?