我正在努力使用EntityFramework 6和PaaS架构。 我有一个存储库项目,它调用DAL项目来执行一些EF6导入的存储过程。直到最近我们才开始使用IaaS架构,但出于某些原因我们改用了PaaS。 WCF服务成功使用了相同的存储库。此WCF服务已转换为Web角色,其工作方式类似于魅力。我现在在Worker Role中使用相同的存储库来取消服务总线的排队并处理数据(由Web角色排队)。 但是在我第一次通过EF6调用存储过程时使用存储库时遇到了错误(获取请求)
Schedule worker error with inner exception : A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server) The underlying provider failed on Open.
at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
at System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection()
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass45`1.b__43()
at System.Data.Entity.Infrastructure.DbExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteFunction[TElement](String functionName, ExecutionOptions executionOptions, ObjectParameter[] parameters)
at XXX.DBContext.XXXEntities.GetTrades(Nullable`1 id, Nullable`1 entityBuy, Nullable`1 entitySell, Nullable`1 sessionId, Nullable`1 orderBuy, Nullable`1 orderSell)
at XXX.RepositoryServices.MarketPlaceService.GetTradeInstances(Nullable`1 EntityBuy, Nullable`1 EntitySell, Nullable`1 SessionId, Nullable`1 OrderBuyId, Nullable`1 OrderSellId)
at WorkerRole1.WorkerRole.Run()
(XXX和YYY是名称空间,但出于政策原因,我无法显示它们) 我尝试在Db(托管在IaaS中)为azure设置防火墙例外,从0.0.0.0到0.0.0.4。 我添加了一个继承自DbConfiguration的配置类,它在ctor中配置如下:
this.SetExecutionStrategy("System.Data.SqlClient", () => SuspendExecutionStrategy
? (IDbExecutionStrategy)new DefaultExecutionStrategy()
:new System.Data.Entity.SqlServer.SqlAzureExecutionStrategy(5,TimeSpan.FromMilliseconds(25)));
(使用SuspendExecutionStrategy = true) 我确保在cspkg中复制了正确版本的EntityFramework和EntityFramework.SqlServer dll。
我的连接字符串也很好(内置凭据)。我确定最后一部分,因为我可以在我的工作者角色Run方法以及使用此存储库的类中成功使用ADO.NET sql查询。 我尝试使用最新版本的EF6(即6.1)并且它不起作用。 我试图将我的工作人员放在与网络角色相同的子网中(不起作用)。 我试图在连接字符串中使用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="data source=negobdd1.YYY.com;initial catalog=XXX;user id=[User];password= [Password];MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
(对不起所有的繁文缛节,但这是客户要求。所有的XXX都是完全相同的字符串) 我尝试从托管工作者角色的azure VM机器连接到使用地址&#34; negobdd1.YYY.com&#34;的.udl文件连接到数据库。以及连接字符串的用户和密码成功。 我也可以成功ping SqlServer机器。
修改
上下文就像这样创建
public partial class NegotiationsPlatformEntities : DbContext
{
public NegotiationsPlatformEntities()
: base("name=NegotiationsPlatformEntities")
{
}
// auto-generated methods here
}
使用此实例
internal NegotiationsPlatform.DBContext.NegotiationsPlatformEntities db = new NegotiationsPlatform.DBContext.NegotiationsPlatformEntities();
除了连接字符串的名称之外,我没有设置任何特殊参数。
RE-修改
在查看DbContext.Database.Connection.Datasource后,我发现显然EF6的目标是本地登台数据库服务器,而不是Azure IaaS SqlServer。 我会调查并回复。
非常感谢任何帮助。
感谢。
答案 0 :(得分:0)
事实证明,工作者角色不像Web角色那样处理连接字符串文件。 因为有多个部署环境,我们有多个名为&#34; connectionStrings&#34; + [目标] +&#34; .config&#34;
在Web角色的 OnStart 方法中,我们使用.bat文件删除任何不必要的配置文件,并将所需文件重命名为&#34; connectionStrings.config&#34;。这样在Azure上部署的webrole中,它只保留PaaS配置文件,然后使用它。 但显然它在工人角色中的工作方式并不相同。
清理&#34; .bat&#34;文件被执行并且只留下一个具有正确内容的配置文件,但使用的是默认配置文件中的内容。所以我猜工作人员在调用OnStart方法之前加载配置文件,因此任何更改都不重要。 (我还没有尝试杀死工作进程,看看重新启动后是否加载了第一个部署中剩余的唯一好文件)
所以这是我的解决方案:删除工作项目中除PaaS之外的所有配置文件,并且不要依赖于#34; .bat&#34; OnStart 期间使用的文件。
非常感谢Dean Ward让我走上了正确的道路:) 总而言之,它只是&#34;只是&#34;连接字符串问题。