我使用的是 Entity Framework 5 Code First,我使用存储库和工作单元模式,并让我的域模型、存储库和服务层在 Windows Azure 云服务中运行的 MVC 应用程序中正常工作。我将 Unity 用于 IoC 并根据需要注入存储库、控制器和服务类,并使用每个请求的生命周期。它一直工作得很好。
但是,当我在 Azure Worker Role 中为域、存储库和 EF5 DbContext 使用相同的代码/类库时,指向与 MVC 应用程序相同的 SQL Azure 数据库时,我会遇到奇怪的错误,我看不到从 MVC 应用程序。请注意,此时,我只是在进行读取(选择),没有更新事务。下面的错误消息似乎暗示它无法打开连接。
在 Worker Role 中,我有一个引导程序静态类来构建容器并在其中注册所有服务。在worker角色启动时,我必须做一些工作,所以我调用引导程序来注册服务,然后我解决其中的几个以立即使用。这些服务被注入存储库,而存储库又被注入我的 DbContext,所有这些都是由 IoC 容器构建的。对于 DbContext,我在 IoC 容器中使用 Unity 的 HierarchicalLifeTimeManager。
当我的服务类在运行辅助角色时尝试从数据库中读取数据时,会出现以下错误:
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 应用程序中运行良好。我认为 DbContext 在工作角色中的范围有问题,可能与 IoC 中的生命周期有关,但这只是推测。
有谁知道导致此异常的原因是什么?有人使用 EF、IoC、Repos/UoW 和 Azure Worker 角色吗?建议?