实体框架基础提供程序在打开时失败

本文关键字:失败 程序 框架 实体 | 更新日期: 2023-09-27 18:27:53

下面是我的连接字符串:

connectionString="metadata=res://*/EDMX.Test.csdl|res://*/EDMX.Test.ssdl|res://*/EDMX.Test.msl;provider=System.Data.SqlClient;provider连接字符串=";数据源=home_computer;最初的目录=db_Test;持久安全信息=True;使用者ID=测试用户;密码=1234美元;MultipleActiveResultSets=True";"

这是程序卡住的代码:

EDMX.TestingEntity context = new EDMX.TestingEntity();
var query = from t in context.User
            where t.UserName == _userName
            select t;

运行完上面的代码后,我检查了变量查询,发现了一个异常

基础提供程序在打开时失败。

我检查过:

  1. 服务器和计算机之间的连接正常
  2. 我可以使用用户名testuser和密码$1234登录数据库
  3. 我已经检查了授予testUser权限的数据库(SQL Server)中的安全设置

为什么会出现这种异常情况?我使用的是.net 4.5


添加:

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

我知道这可能是网络问题,但我已经关闭了服务器和电脑的防火墙,再试了一次,但仍然没有成功。。


刚才把连接字符串复制到一个程序来测试这个连接,它运行得很好。。


我只是回滚了所有的更改并再次测试,它运行了

实体框架基础提供程序在打开时失败

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

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

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

  1. 在程序和文件中搜索"组件服务"
  2. 转到服务
  3. 查找"分布式事务协调器"服务
  4. 右键单击并重新启动服务

您刚刚重新启动了服务,代码运行时应该没有错误

我们在web.configData Source=localhost中有连接字符串,出现了这个错误(MSSQL在同一台机器上)。将其更改为实际的"DOMAIN''MACHINE"有帮助,这也是为什么。

本代码项目提示中描述了可能的解决方案:

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

  1. 打开Internet信息服务管理器
  2. 单击左侧导航树中的应用程序池
  3. 选择您的版本池。在我的例子中,我使用的是ASP.Net v4.0。如果您没有此版本,请选择DefaultAppPool
  4. 右键单击步骤3,然后选择高级设置
  5. 在属性窗口中选择"标识",然后单击按钮更改值
  6. 选择"内置帐户中的本地系统"组合框,然后单击"确定"。就是这样。现在运行您的应用程序。一切都很好

如果有内部异常,请始终检查。在我的案例中,内部异常对解决这个问题真的很有帮助。

我的网站在开发环境中运行良好。但在我部署到生产环境后,它开始发出这个异常,但内部异常表示特定用户的登录失败
所以我发现这与连接本身有关。因此,尝试使用SSMS登录,但最终还是失败了。

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

简而言之,将Authentication更改为Mixed(SQL和Windows),为我解决了这个问题。:)

请首先检查以下内容。

在生成Edmx时,您会为连接字符串指定一个名称。进入具有实体的项目的应用程序配置中。

是否已将相同的连接字符串复制到主配置文件中。此外,名称应与您在生成EDMX文件时给定的名称相同。

当一位同事试图连接到受VPN保护的数据库时,我看到了这个错误。该用户已切换到无法访问VPN的无线网络。测试这种情况的一种方法是查看是否可以通过另一种方式(如SSMS)建立连接,并查看是否也会失败。

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

我复制了同样的场景,在我的开发系统中也出现了同样的错误。删除*ldf文件后修复了错误。

对我来说,当这种情况通常开始发生时,我必须将桌面远程连接到服务中,并至少重新启动IIS。它通常在我部署代码之后就开始弹出。在极少数情况下,我不得不重新启动SQL服务和IIS。我写了一个批处理脚本来获取参数(1或2),并将其设置为重新启动IIS(即1)或进行完全核操作(即2)。

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

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

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

我在继续执行一个单元测试时遇到了这个问题,该测试调用了一个使用并行处理的方法。我知道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

我有这个错误,它是由App.config中的连接字符串中的拼写错误引起的。

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

我也面临同样的问题。尽管在我的情况下,我试图将我的桌面应用程序连接到远程数据库。所以对我来说,以上这些都不起作用。我只需添加端口(作为128.02.39.29:3315)就解决了这个问题,它神奇地工作了!我之所以一开始就不想添加端口,是因为我在另一个桌面应用程序中使用了相同的方法(没有端口),而且效果很好。所以我希望这也能帮助到一些人。

此解决方案适用于部署windows应用程序时面临此问题的人员

我知道这已经很晚了,但这可能对将来的人有用。在我的场景中,这纯粹是一个连接字符串问题。我使用实体框架(DB First方法)开发了一个windows应用程序,并发布了它,代码在我的机器上运行良好,但在客户端机器上不起作用

此问题的原因:-

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

因此,在部署之后,我们需要更改"中的连接字符串;应用程序名称";。exe.config文件

此错误已解决。当我创建新密码时,我的sql server密码已过期,然后我的应用程序将完美登录

尝试此操作-以管理员身份打开命令提示符,然后键入netsh Winsock重置

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

如果您使用的是本地.mdf文件,可能是像Dropbox这样的同步软件试图同步两个日志文件(.ldf)在两台不同的计算机中您可以从bin目录中删除日志文件,并确保.mdf属性->复制到输出目录->如果更新则复制它将把选定的数据库文件及其日志复制到bin目录中。!警告-如果您的数据库文件只在bin目录中发生了更改,则所有更改都将被丢弃!

打开SQL Server Configuration Manager,然后单击SQL Server服务。列表中会显示一个列表。右键单击SQL Server,然后单击启动

只需重新启动服务器PC,然后先连接VPN,不打开Visual Studio,然后运行查询出的解决方案并正常运行

错误:"System.Data.Entity.Core.EntityException"类型的异常在EntityFramework.SqlServer.dll中发生,但未在用户中处理code附加信息:基础提供程序在打开时失败。

解决方案:

  • 附加模块型号:

     [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; }      
      }
    }