实体框架基础提供程序在Open上失败

时间:2013-08-16 10:35:04

标签: c# entity-framework

以下是我的连接字符串:

  

的connectionString =“元数据= RES://*/EDMX.Test.csdl | RES://*/EDMX.Test.ssdl | RES://*/EDMX.Test.msl;提供商= System.Data。的SqlClient提供方   connection string =“Data Source = home_computer; Initial   目录= db_Test;持久安全信息=真;用户   ID =为testUser;密码= $ 1234; MultipleActiveResultSets =真 “”

这是程序卡住的代码:

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

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

运行上面的代码后,我检查变量查询并发现异常

  

底层提供程序在Open上失败。

我查了一下:

  1. 服务器和计算机之间的连接正常
  2. 我可以使用用户名testuser和密码$ 1234
  3. 登录数据库
  4. 我已检查数据库(SQL Server)中已授予testUser权限的安全设置
  5. 为什么会发生此异常?我正在使用.net 4.5


    添加了:

    我再次尝试,看看内部异常,它是: 建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)

    我知道这可能是一个网络问题,但我已经关闭了服务器和我的电脑的防火墙并再次尝试但仍未成功..


    刚刚将连接字符串复制到一个程序来测试这个连接,它运行良好..


    我只是回滚所有更改并再次测试并且有效

20 个答案:

答案 0 :(得分:43)

似乎是一个连接问题。您可以使用数据链接属性来查找连接是否正常。执行以下操作:

  1. 创建一个空白记事本并将其重命名为“X.UDL”
  2. 双击打开它
  3. 在“连接”选项卡下,选择服务器名称/输入名称 使用正确的凭据和DB
  4. 单击“确定”保存。
  5. 现在在记事本中打开文件并比较连接字符串属性。

答案 1 :(得分:9)

  1. 搜索“程序和文件”中的“组件服务”
  2. 转到服务
  3. 查找“分布式事务处理协调器”服务
  4. 右键单击并重新启动服务
  5. 您刚刚重启了服务,代码应该无误地运行

答案 2 :(得分:6)

this Code Project tip中描述了可能的解决方案:

  

当人们在尝试登录sql server时提到IIS用户网络服务用户凭据。因此,只需更改IIS中的应用程序池设置:

     
      
  1. 开放互联网信息服务管理器
  2.   
  3. 单击左侧导航树中的“应用程序池”。
  4.   
  5. 选择您的版本池。就我而言,我使用ASP .Net v4.0。如果您没有此版本,请选择DefaultAppPool。
  6.   
  7. 右键单击第3步,然后选择高级设置。
  8.   
  9. 在属性窗口中选择标识,然后单击按钮以更改值。
  10.   
  11. 在内置帐户组合框中选择本地系统,然后单击确定。   就是这样。现在运行您的应用程序一切都运作良好。
  12.   

答案 3 :(得分:5)

我们在web.config中有Data Source=localhost的连接字符串,并且出现此错误(MSSQL在同一台计算机上)。将它改为实际的`DOMAIN \ MACHINE'有帮助,不管怎么说。

答案 4 :(得分:4)

请先检查以下事项。

在生成Edmx时,您可以为连接字符串指定名称。用实体进入项目的app配置。

您是否已将相同的连接字符串复制到主Config文件中。 名称也应与生成EDMX文件时给出的名称相同。

答案 5 :(得分:4)

如果有的话,请务必检查内部异常。在我的案例中,Inner Exception对于解决问题非常有帮助。

我的网站在Dev Environment中运行良好。但是在我部署到生产之后,它开始发出此异常,但内部异常表示登录对特定用户失败。
所以我发现它与连接本身有关。因此尝试使用SSMS登录,甚至失败。

最终发现异常出现的原因很简单,SQL服务器只启用了Windows身份验证,而SQL身份验证失败了,这就是我用于身份验证的内容。

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

答案 6 :(得分:3)

我的客户报告了此错误。我发现他正在弄乱* .ldf文件。他将* ldf文件复制到一个数据库并重命名为第二个数据库(我要求他放在一个文件夹中)。

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

答案 7 :(得分:3)

当一位同事试图连接到受VPN保护的数据库时,我看到了这个错误。用户已将未知信息切换到无法访问VPN的无线网络。测试此方案的一种方法是查看是否可以使用其他方式建立连接,例如SSMS,并查看是否也失败。

答案 8 :(得分:2)

对于我通常会开始发生的事情,我必须将远程桌面插入服务并至少重启IIS。它通常在我部署代码后立即弹出。在极少数情况下,我不得不重新启动SQL服务和IIS。我写了一个批处理脚本来获取一个参数(1或2)并设置为重新启动IIS(即1),或者完全核(即2)。

答案 9 :(得分: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时,问题就消失了。

乔伊

答案 10 :(得分:1)

此解决方案适用于在部署 windows应用时遇到此问题的人

我知道这很晚了,但是这可能对将来的某个人有用。在我的场景中,这纯粹是一个连接字符串问题,我使用实体框架(DB First方法)开发了一个Windows应用程序,并发布了该代码,在我的计算机上工作正常,但在客户端计算机上却不工作

此问题的原因:-

我更新了App.config文件中的客户端计算机连接字符串,但这是错误的,如果是Windows应用程序,则它将不读取来自App.config的连接字符串(对于已部署计算机),它将从.exe.config文件读取,

因此,部署后,我们需要在“ AppicationName” .exe.config文件中更改连接字符串

答案 11 :(得分:1)

我今天遇到了同样的错误,我做错了什么是我没有在连接字符串中添加密码标签。一旦我添加了带有正确密码的密码标签,错误就消失了。希望对别人有帮助。

答案 12 :(得分:1)

就我而言,我通过在连接字符串中添加连接密码来解决错误。

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

答案 13 :(得分:1)

我遇到此错误,这是由App.config中连接字符串中的拼写错误引起的。

答案 14 :(得分:1)

我在开发机器上运行时经常遇到这个异常,特别是在我进行代码更改,重建代码,然后执行相关的网页之后。但是,如果我将CommandTimeout参数提升到120秒或更长时间(例如,在LINQ语句之前设置context.Database.CommandTimeout = 120),问题就消失了。虽然这最初是在3年前提出的,但它可能有助于寻找答案的人。我的理论是VisualStudio需要时间将构建的二进制库转换为机器代码,并在尝试连接到SQL Server之后及时编译时超时。

答案 15 :(得分:0)

打开SQL Server配置管理器然后单击sql server服务列表将从列表中右键单击sql server并单击start

答案 16 :(得分:0)

如果您使用的是本地.mdf文件, 可能是同步软件,如Dropbox试图同步两个日志文件(.ldf) 在两台不同的电脑上 您可以从bin目录中删除日志文件,并确保.mdf属性 - >复制到输出目录 - >如果更新则复制 这将复制选定的DB文件,并将其登录到bin目录。 !警报 - 如果您的数据库文件仅在bin目录中已更改,则所有更改都将被丢弃!

答案 17 :(得分:0)

我遇到了同样的问题。尽管就我而言,我试图将桌面应用程序连接到远程数据库。所以对我来说,以上所有方法均无效。我只需添加端口(如128.02.39.29:3315即可解决此问题,它神奇地起作用了! 首先我不费心添加端口的原因是因为我在另一个桌面应用程序中使用了相同的方法(没有端口)并且可以正常工作。 因此,我希望这也可以对某人有所帮助。

答案 18 :(得分:0)

试试这个 - 以管理员身份打开命令提示符并键入此命令 netsh Winsock重置

重新启动系统,然后重试。

答案 19 :(得分:-3)

  

错误:#System; System.Data.Entity.Core.EntityException类型的例外'   发生在EntityFramework.SqlServer.dll但未在用户中处理   代码附加信息:基础提供程序在Open上失败。

解决方案:

  • 添加模型:

     [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
     [Key] 
    
  • 命名空间:

    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    
  • 示例:

    namespace MvcApplication1.Models
    {
      [Table("tblEmployee")]
      public class Employee
      {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Key]
        public int EmplyeeID { get; set; }         
        public string Name { get; set; }
        public string Gender { get; set; }
        public string City { get; set; }      
      }
    }