实体框架5和亚马逊RDS - “底层提供程序在打开时失败。”

3

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

我有一个单元测试,该测试对用户进行身份验证,然后尝试使用Entity Framework调用在表中插入记录-- 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范围覆盖。
  • 当我尝试打开数据上下文上的连接时,就会出现错误。
  • 数据库服务器已配置为接受远程连接。
  • 数据库服务器已配置为使用混合身份验证(包括Windows和SQL Server)。

Entity Framework连接字符串

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 无关。 - aikeru
2
我会认为这是一个与网络有关的问题(因为这是唯一改变的东西),但我可以使用.NET Membership调用命中数据库并进行身份验证。只有当我尝试在我的EF数据上下文中打开数据库连接时,才会遇到问题。dataContext.Database.Connection.Open(); - wloescher
好的。所以如果您的成员提供程序和EF正在访问同一台服务器/数据库,您应该确保信息匹配。您是使用数据库优先/模型优先吗...? - aikeru
数据库优先模型。将会仔细检查连接字符串。 - wloescher
切换到ODBC连接后,它可以正常工作(在用内联SQL语句替换EF代码之后)。因此,这似乎排除了环境和数据库权限问题。 - wloescher
1个回答

3
问题出在连接字符串中。具体来说,我在其中有“应用程序名称”和“App”属性。一旦我将它们删除,它就可以正常工作。

糟糕的写法:

<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" />

GOOD:

<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" />

太好了!我本来要发布一个答案,介绍一些你字符串之间的差异(不知道它们的重要性),并建议你尝试其中一个。很高兴看到这个问题得到解决! - aikeru
1
你有任何想法为什么移除应用程序名称解决了这个问题吗? - Rob
我遇到了同样的问题,但这对我没有任何帮助:( 我的本地数据库运行良好。将其部署到我的服务器上,只有一个连接可以工作。另一个则不行。它们都在同一数据库服务器上,使用不同的数据库和相同的用户名。 - fujiiface

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接