【问题标题】:Entity Framework 5 and Amazon RDS - "The underlying provider failed on Open."Entity Framework 5 和 Amazon RDS -“底层提供商在打开时失败。”
【发布时间】:2013-04-19 03:35:00
【问题描述】:

我有一个 C#/Entity Framework Web 应用程序在本地 SQL 2012 db 上运行良好。我将数据库复制到一个新的 RDS 实例中,并且可以通过 Visual Studio 和 SQL Server Management Studio 访问数据库。

我有一个单元测试,它对用户进行身份验证,然后尝试使用实体框架调用在表中插入一条记录 -- dataContext.SaveChanges()。

我收到以下错误:

{"The underlying provider failed on Open."}
{"No such host is known"}
{"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: TCP Provider, error: 0 - No such host is known.)"}

我整天在网上寻找答案,到目前为止,我发现的任何建议都没有成功:

  • 1433 端口已打开,我可以通过 Telnet 访问入口点
  • 我的 IP 地址包含在 CIDR/IP 范围内,以实现默认安全性 组。
  • 当我尝试打开连接时出现错误 在数据上下文上。
  • db 服务器配置为接受远程 连接。
  • db 服务器配置为使用混合身份验证 (Windows 和 SQL Server)。

实体框架连接字符串

connectionString = "metadata=res://*/MyDb.csdl|res://*/MyDb.ssdl|res://*/MyDb.msl;provider=System.Data.SqlClient;provider connection string="Data Source=MyAwsEntryPoint;Initial Catalog=MyDb;User ID=MyUser;Password=MyPassword;Persist Security Info=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient"

标准数据库连接字符串

connectionString = "Data Source=MyAwsEntryPoint,1433;Initial Catalog=MyDb;User ID=MyUser;Password=MyPassword;Persist Security Info=True;Application Name=MyAppName;"

【问题讨论】:

  • 看起来这是一个与网络相关的问题,与 EF 无关。
  • 我会假设一个与网络相关的问题(因为这是唯一改变的事情),但我可以点击 db 并使用 .NET Membership 调用进行身份验证。只有当我尝试在我的 EF 数据上下文上打开一个数据库连接时,我才会遇到问题。 dataContext.Database.Connection.Open();
  • 很公平。因此,如果您的会员提供商和 EF 访问的是同一个服务器/数据库,您应该确保信息匹配。您是否首先使用数据库/模型...?
  • 数据库第一模型。将仔细检查连接字符串。
  • 切换到 ODBC 连接它工作得很好(在将 EF 代码换成内联 SQL 语句之后)。所以这似乎排除了环境和数据库权限问题。

标签: visual-studio-2012 amazon-web-services entity-framework-5 sql-server-2012 amazon-rds


【解决方案1】:

问题出在连接字符串中。具体来说,我在那里有“应用程序名称”和“应用程序”属性。一旦我删除了这些,它就起作用了。

不好:

<add name="MyDbEntities" connectionString="metadata=res://*/MyDb.csdl|res://*/MyDb.ssdl|res://*/MyDb.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=MyDbServer;Initial Catalog=MyDb;Persist Security Info=True;User ID=MyDb;Password=MyPassword;Application Name=MyDb.API.Models;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

好:

<add name="MyDbEntities" connectionString="metadata=res://*/MyDb.csdl|res://*/MyDb.ssdl|res://*/MyDb.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=MyDbServer;Initial Catalog=MyDb;Persist Security Info=True;User ID=MyDb;Password=MyPassword;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

【讨论】:

  • 万岁!我实际上是要发布一个答案,其中包含您的字符串之间的一些差异(不知道有什么意义),并建议您应该尝试一个。很高兴看到这个问题得到解决!
  • 您知道为什么删除应用程序名称可以解决问题吗?
  • 我遇到了同样的问题,这对我没有任何帮助:(我的本地数据库工作正常。部署到我的服务器,一个我的连接工作。另一个没有。他们都在同一个数据库服务器,不同的数据库,相同的用户名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多