1

我使用的是实体框架5代码首先,我使用存储库和工作单元模式,并将我的域模型,存储库和服务层在运行在Windows Azure云服务中的MVC应用程序内正常工作。我使用Unity for IoC并根据需要注入存储库,控制器和服务类,并使用每个请求的生命周期。它一直在努力工作。使用EF5代码优先使用Unity Azure中的IoC Azure工作者角色针对SQL Azure

但是,当我使用Azure工作者角色中指向与MVC应用程序相同的SQL Azure数据库的域,存储库和EF5 DbContext的相同代码/类库时,出现奇怪的错误,没有从MVC应用程序中看到。请注意,在这一点上,我只是在读取(select),没有更新事务。下面的错误消息似乎暗示它无法打开连接。

在工作者角色中,我有一个引导程序静态类来构建容器并在其中注册所有服务。在工作角色启动时,我必须做一些工作,所以我打电话给引导程序来注册服务,然后解决其中的几个问题,以便立即使用。这些服务被注入了库,后者又被注入了我的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角色的人员?建议?

+0

这可能是由于EF未找到您的连接字符串。我相信Azure有时会使用与正常的web.config或app.config不同的配置机制,因此可能是由于此原因。另外,发布EF问题时最好使用entity-framework标签。 –

+0

@ArthurVickers这可以在Web角色(MVC)中正常工作,并且只会偶尔出现在辅助角色(app.config中的conn字符串)中。我如何确认EF没有找到连接字符串? ... btw按照要求编辑了标签。 –

+2

我错过了它只是偶尔发生。在这种情况下,它很可能只是SQL Azure连接的正常不可靠性。有关背景信息和https://entityframework.codeplex.com/wikipage,请参阅http://blogs.msdn.com/b/sqlazure/archive/2013/01/02/10011247.aspx?title = Connection%20Resiliency%20Spec适合我们在EF6中做的工作。 –

回答

1

感谢Arthur Vickers对我的问题发表了评论,我会继续努力,并将其记录在由于Azure SQL数据库连接导致的暂时错误上。我从来没有能够完全证明这一点,但是,我在Azure上创建了一个SQL虚拟机并创建了我的数据库,然后将我的云服务应用程序改为指向该数据库。

被监控日志,并没有看到同样的问题尚未...

一个潜在的选择,如果我回到Azure的SQL数据库是推出采用瞬态故障处理块从微软自己的重试逻辑P & P,或使用像Rob Moore的ReliableDbProvider(https://github.com/robdmoore/ReliableDbProvider)这样的项目。

当EF6出来时,我会研究使用内置功能来处理瞬态错误。

希望这可以帮助别人。

相关问题