实体框架:底层提供程序在打开时失败。

44

以下是我的连接字符串:

connectionString="metadata=res://*/EDMX.Test.csdl|res://*/EDMX.Test.ssdl|res://*/EDMX.Test.msl;provider=System.Data.SqlClient;provider connection string="Data Source=home_computer;Initial Catalog=db_Test;Persist Security Info=True;User ID=testUser;Password=$1234;MultipleActiveResultSets=True""

以下是程序停滞的代码:

EDMX.TestingEntity context = new EDMX.TestingEntity();

var query = from t in context.User
            where t.UserName == _userName
            select t;

运行以上代码后,我检查了变量query并发现了一个异常。
引起这个异常的原因是底层提供程序在打开时失败。
我已经检查过:
1. 服务器和计算机之间的连接是正常的 2. 我可以使用用户名testuser和密码$1234登录到数据库 3. 我已经检查了数据库(SQL Server)中的安全设置,已授予testUser权限
为什么会出现这种异常?我正在使用.net 4.5。
补充:
我尝试了一下,查看内部异常,发现是:
在建立与SQL Server的连接时发生了与网络相关或特定于实例的错误。找不到服务器或无法访问。请验证实例名称是否正确,并且SQL Server已配置为允许远程连接。(提供程序:命名管道提供程序,错误:40 - 无法打开到SQL Server的连接)
我知道这可能是一个网络问题,但我已经关闭了服务器和计算机的防火墙,再次尝试但仍然没有成功。
刚才我将连接字符串复制到一个程序中测试该连接,结果功能正常。
我刚刚回滚了所有更改并重新测试,结果成功了。

2
检查家用电脑的防火墙规则,允许 SQL Server 端口(默认为 1433)的传入连接。 - Adel Khayata
3
有内部异常吗? - Uwe Keim
@Adel Khayata 我已经关闭了防火墙并进行了测试,仍然没有成功。 - User2012384
3
回滚之后现在工作正常了吗?有什么原因导致的,有任何想法吗? - Ramesh Sivaraman
1
如何执行Adel Khayata建议的操作说明可以在此处找到:https://blogs.msdn.microsoft.com/walzenbach/2010/04/14/how-to-enable-remote-connections-in-sql-server-2008/。 - Dov Miller
显示剩余3条评论
22个回答

61

看起来像是连接问题。您可以使用“数据链接属性”找出连接是否正常。请按照以下步骤操作:

  1. 创建一个空的记事本并将其重命名为“X.UDL”
  2. 双击打开它
  3. 在连接选项卡下选择服务器名称/输入名称,使用正确的凭据和数据库
  4. 单击“确定”保存它。

现在在记事本中打开文件并比较连接字符串属性。


你能更详细地解释一下这个过程吗?我不确定该怎么做。我应该在哪里创建这个文件?我需要在 Visual Studio 中打开它吗? - Goku
1
谢谢你,Ramesh!!!我一开始以为“创建一个空白记事本”是什么鬼?但当我考虑批评时,我想,也许他真的意味着打开一个新的、空白的记事本文件……然后,这个方法居然奏效了!! - jwolf

16
  1. 在“程序和功能”中搜索“组件服务”
  2. 进入“服务”
  3. 找到“分布式事务协调器”服务
  4. 右键单击并重启服务

您刚刚重新启动了服务,代码应该可以无错误运行


7

我们在web.config中使用了连接字符串Data Source=localhost,但是出现了这个错误(MSSQL在同一台机器上)。将其更改为实际的`DOMAIN\MACHINE'有所帮助,原因不明。


6
可能的解决方案在这篇 Code Project 小贴士中描述:
正如一些人所提到的,在尝试登录 SQL Server 时使用了 IIS 用户网络服务用户凭据。因此,只需更改您的 IIS 中的应用程序池设置:
  1. 打开 Internet Information Service 管理器
  2. 在左侧导航树中单击“应用程序池”。
  3. 选择您的版本池。在我的情况下,我正在使用 ASP .Net v4.0。如果您没有此版本,请选择 DefaultAppPool。
  4. 右键单击步骤 3,并选择高级设置。
  5. 在属性窗口中选择标识,并单击按钮以更改值。
  6. 在内置帐户组合框中选择 Local System,然后单击确定。 就是这样。现在运行您的应用程序。一切都很顺利。

5

如果有内部异常,一定要进行检查。在我的情况下,内部异常对于解决问题非常有帮助。

我的网站在开发环境中运行良好。但是当我将其部署到生产环境后,它开始抛出此异常,但是内部异常显示特定用户的登录失败。
因此,我发现这与连接本身有关。因此,尝试使用SSMS登录,结果也失败了。

最终发现,异常之所以出现是因为SQL服务器仅启用了Windows身份验证,而我正在使用SQL身份验证进行身份验证,因此失败了。

总之,将身份验证更改为混合(SQL和Windows)解决了我的问题。 :)


节省时间的好建议。始终检查内部异常 - Shaiju T

4
请首先检查以下内容。
在生成Edmx文件时,您将为连接字符串命名。该名称将与实体一起进入项目的应用配置中。
您是否将相同的连接字符串复制到了主配置文件中。 并且名称应与生成EDMX文件时所给出的名称相同。

我已经仔细检查了app.config中的名称,有没有办法在调试时检查EDMX中的连接字符串? - User2012384

4

我看到一个同事在尝试连接一个被VPN保护的数据库时出现了这个错误。该用户不知情地切换到了一个没有VPN访问权限的无线网络。测试这种情况的一种方法是尝试使用另一种方式建立连接,比如SSMS,并查看是否也失败了。


3

我的客户报告了这个错误。我发现他在搞*.ldf文件。他把一个*ldf文件复制到一个数据库上,并将其重命名以匹配第二个数据库(我要求他将其放在一个文件夹中)。

我复制了相同的场景,在我的开发系统中得到了相同的错误。删除*ldf文件后,错误得到了修复。


2

我在执行调用并行处理的方法的单元测试时遇到了这个问题。我知道EF中有一些部分是不支持多线程的,所以我想知道是否存在冲突,在操作中连接的开启和关闭是否同步。

我的堆栈跟踪显示了以下内容:

     at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at System.Threading.Tasks.Task.Wait()
   at System.Threading.Tasks.Parallel.ForWorker[TLocal](Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Func`4 bodyWithLocal, Func`1 localInit, Action`1 localFinally)
   at System.Threading.Tasks.Parallel.ForEachWorker[TSource,TLocal](IList`1 list, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Action`3 bodyWithStateAndIndex, Func`4 bodyWithStateAndLocal, Func`5 bodyWithEverything, Func`1 localInit, Action`1 localFinally)
   at System.Threading.Tasks.Parallel.ForEachWorker[TSource,TLocal](IEnumerable`1 source, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Action`3 bodyWithStateAndIndex, Func`4 bodyWithStateAndLocal, Func`5 bodyWithEverything, Func`1 localInit, Action`1 localFinally)
   at System.Threading.Tasks.Parallel.ForEach[TSource](IEnumerable`1 source, Action`1 body)

所以这就是我遵循的线索。当我回到单线程 foreach 而不是 Parallel.ForEach 时,问题消失了。

Joey


2

在我的情况下,我通过在连接字符串中添加连接密码来解决了这个错误。

在设置EF模型时,我选择了从连接字符串中排除敏感数据的选项。因此,密码最初未被包括在内。


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