C# EF6和azure工作角色:基础提供程序在打开时失败

C# EF6和azure工作角色:基础提供程序在打开时失败,c#,entity-framework,azure,entity-framework-6,azure-worker-roles,C#,Entity Framework,Azure,Entity Framework 6,Azure Worker Roles,我正在努力使用EntityFramework 6和PaaS体系结构。 我有一个存储库项目,它调用一个DAL项目来执行一些EF6导入的存储过程。直到最近,我们还在寻求IaaS体系结构,但出于某些原因,我们转向了PaaS。WCF服务已成功使用该存储库。此WCF服务已转换为Web角色,工作起来很有魅力。现在,我在Worker角色中使用同一个存储库对服务总线和处理数据(由Web角色排队)进行解队列。 但是,在我第一次通过EF6(Get请求)调用存储过程时,我在使用存储库时遇到了错误 (使用Suspend

我正在努力使用EntityFramework 6和PaaS体系结构。 我有一个存储库项目,它调用一个DAL项目来执行一些EF6导入的存储过程。直到最近,我们还在寻求IaaS体系结构,但出于某些原因,我们转向了PaaS。WCF服务已成功使用该存储库。此WCF服务已转换为Web角色,工作起来很有魅力。现在,我在Worker角色中使用同一个存储库对服务总线和处理数据(由Web角色排队)进行解队列。 但是,在我第一次通过EF6(Get请求)调用存储过程时,我在使用存储库时遇到了错误

(使用SuspendExecutionStrategy=true) 我确保在cspkg中复制了正确版本的EntityFramework和EntityFramework.SqlServer DLL

我的连接字符串也很好(里面有凭据)。我确信最后一部分,因为我可以在我的工作者角色运行方法以及使用此存储库的类中成功地使用ADO.NET sql查询。 我尝试了EF6的最新版本(即6.1),但它不起作用。 我试图将我的工作人员与web角色放在同一子网中(不起作用)。 我试图在连接字符串中使用SqlServer的IP地址,但没有成功。ADO.NET和EF6使用相同的连接字符串

    <add name="XXXEntities" connectionString="metadata=res://*/XXXContext.csdl|res://*/XXXContext.ssdl|res://*/XXXConte xt.msl;provider=System.Data.SqlClient;provider connection string=&quot;data  source=negobdd1.YYY.com;initial catalog=XXX;user id=[User];password= [Password];MultipleActiveResultSets=True;App=EntityFramework&quot;"  providerName="System.Data.EntityClient" />
用这个例子

     internal NegotiationsPlatform.DBContext.NegotiationsPlatformEntities db = new NegotiationsPlatform.DBContext.NegotiationsPlatformEntities();
除了连接字符串的名称之外,我没有设置任何特殊参数

重新编辑

在查看DbContext.Database.Connection.Datasource之后,我发现EF6的目标显然是本地暂存db服务器,而不是Azure IaaS SqlServer。 我会调查并发回

任何帮助都将不胜感激


谢谢。

事实证明,工作者角色处理连接字符串文件的方式与web角色不同。 因为有多个部署环境,所以我们有多个名为“ConnectionString”+[target]+“.config”的文件

在web角色的OnStart方法中,我们使用.bat文件删除任何不必要的配置文件,并将所需文件重命名为“connectionStrings.config”。这样,在Azure上部署的webrole中,它只保留PaaS配置文件,然后使用它。 但显然,它在工人角色中的工作方式不同

执行cleanup“.bat”文件,只留下一个包含正确内容的配置文件,但使用的是默认配置文件中的内容。因此,我猜工作者在调用OnStart方法之前加载配置文件,因此任何更改都无关紧要。 (我没有试图杀死工作进程,以查看在重新启动后,它是否加载了第一次部署后剩余的唯一好文件)

因此,我的解决方案是:删除worker项目中除PaaS文件之外的所有配置文件,并且不要依赖于启动时使用的“.bat”文件

非常感谢迪安·沃德让我走上了正确的道路:)
总之,这“只是”一个连接字符串的问题。

请阅读InnerException。@Slarks这就是异常的范围。我内心没有例外。例外情况是直接从DAL捕获。您提到连接字符串在ADO.NET中工作正常-但是您显示的连接字符串是EF的。你确定这两个连接字符串是相同的吗?@Dean Ward My bad。我在这方面不完全准确,我检查了ADO.NET的连接字符串是user,密码与EF连接字符串中的密码相同。它的目标是具有相同sql凭据的相同sql server。能否更新您的问题以显示如何创建上下文?
    <add name="XXXEntities" connectionString="metadata=res://*/XXXContext.csdl|res://*/XXXContext.ssdl|res://*/XXXConte xt.msl;provider=System.Data.SqlClient;provider connection string=&quot;data  source=negobdd1.YYY.com;initial catalog=XXX;user id=[User];password= [Password];MultipleActiveResultSets=True;App=EntityFramework&quot;"  providerName="System.Data.EntityClient" />
    public partial class NegotiationsPlatformEntities : DbContext
    {
        public NegotiationsPlatformEntities()
        : base("name=NegotiationsPlatformEntities")
        {
        }

    // auto-generated methods here

    }
     internal NegotiationsPlatform.DBContext.NegotiationsPlatformEntities db = new NegotiationsPlatform.DBContext.NegotiationsPlatformEntities();