我使用的是Entity Framework 5代码首先,我使用存储库和工作单元模式,并使我的域模型、存储库和服务层在运行于Windows Azure云服务中的MVC应用程序中正常工作。我使用Unity for IoC,并根据需要注入存储库、控制器和服务类,并使用每个请求的生存期。它一直运行得很好。
然而,当我在Azure Worker角色中为域、存储库和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角色吗?建议?
感谢Arthur Vickers对我的问题发表了评论,我将继续将其归因于Azure SQL数据库连接导致的暂时错误。我从来没能完全证明这一点,然而,我在Azure上提出了一个SQL VM,并在那里创建了我的数据库,然后更改了我的云服务应用程序,改为指向那个数据库。
一直在监视日志,还没有看到同样的问题。。。
如果我返回Azure SQL Db,一个潜在的选择是使用Microsoft p&P、 或者使用Rob Moore的ReliableDbProvider这样的项目(https://github.com/robdmoore/ReliableDbProvider)。
当EF6问世时,我将研究使用内置功能来处理瞬态错误。
希望这能帮助其他人。