【问题标题】:"The underlying provider failed on Open" Error when using EF5 Code First with Unity IoC in Azure Worker Role against SQL Azure在针对 SQL Azure 的 Azure Worker Role 中使用带有 Unity IoC 的 EF5 Code First 时出现“底层提供程序在打开时失败”错误
【发布时间】:2025-11-29 12:35:01
【问题描述】:

我使用的是 Entity Framework 5 Code First,我使用存储库和工作单元模式,并让我的域模型、存储库和服务层在 Windows Azure 云服务中运行的 MVC 应用程序中正常工作。我将 Unity 用于 IoC,并根据需要注入存储库、控制器和服务类,并使用每个请求的生命周期。效果很好。

但是,当我在 Azure Worker 角色中为域、存储库和 EF5 DbContext 使用相同的代码/类库时,指向与 MVC 应用程序相同的 SQL Azure 数据库时,我会遇到奇怪的错误从 MVC 应用程序中看不到。请注意,此时,我只是在进行读取(选择),没有更新事务。下面的错误消息似乎暗示它无法打开连接。

在 Worker 角色中,我有一个引导程序静态类来构建容器并在其中注册所有服务。在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 角色吗?有什么建议吗?

【问题讨论】:

  • 这可能是因为 EF 没有找到您的连接字符串。我相信 Azure 有时会使用与普通 web.config 或 app.config 不同的配置机制,因此可能是由于这个原因。另外,发布 EF 问题时最好使用 entity-framework 标签。
  • @ArthurVickers 这在 Web 角色 (MVC) 中运行良好,并且仅在辅助角色中偶尔出现(app.config 中的 conn 字符串)。我如何确认 EF 没有找到连接字符串? ...顺便说一句,根据要求编辑了有关问题的标签。
  • 我错过了它只是偶尔发生。在这种情况下,很可能只是 SQL Azure 连接的正常不可靠性。请参阅 blogs.msdn.com/b/sqlazure/archive/2013/01/02/10011247.aspx 了解背景,entityframework.codeplex.com/… 了解我们在 EF6 中围绕此所做的工作。

标签: entity-framework ef-code-first unity-container repository-pattern azure-worker-roles


【解决方案1】:

感谢 Arthur Vickers 对我的问题发表评论,我将继续将其归结为由于 Azure SQL 数据库连接导致的暂时性错误。我无法完全证明这一点,但是,我在 Azure 上启动了一个 SQL VM,并在那里创建了我的数据库,然后将我的云服务应用程序改为指向该数据库。

一直在监控日志,还没有发现同样的问题...

如果我返回 Azure SQL Db,一个可能的选择是使用 Microsoft P&P 的瞬态故障处理块来滚动我自己的重试逻辑,或者使用像 Rob Moore 的 ReliableDbProvider (https://github.com/robdmoore/ReliableDbProvider) 这样的项目。

当 EF6 出现时,我将研究使用内置功能来解决瞬态错误。

希望这对其他人有所帮助。

【讨论】:

    最近更新 更多