【问题标题】:Entity Framework : "The underlying provider failed on Open"实体框架:“底层提供程序在打开时失败”
【发布时间】:2010-05-16 19:35:34
【问题描述】:

当我尝试插入记录时,我收到此错误:底层提供程序在打开时失败。 此错误仅发生在 IIS 上,而不会发生在 VWD 2008 的网络服务器上。 在 EventViewer 中,我收到此应用程序错误:由于启动用户实例的进程失败,无法生成 SQL Server 的用户实例。连接将被关闭。 [客户:]

<add name="ASPNETDBEntities"
     connectionString="
         metadata=res://*/Models.FriendList.csdl|res://*/Models.FriendList.ssdl|res://*/Models.FriendList.msl;
         provider=System.Data.SqlClient;
         provider connection string=&quot;
         Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF;
         Integrated Security=True;
         Connect Timeout=30;
         User Instance=True;
         MultipleActiveResultSets=True&quot;"
     providerName="System.Data.EntityClient" />

我使用的是 aspnetdb.mdf 文件,而不是任何外部数据库。 我已经搜索了足够的这个,但没有用。

VWD 网络服务器一切正常

【问题讨论】:

    标签: asp.net entity-framework


    【解决方案1】:

    您应该为您的 Web 服务器创建一个 sql 帐户以访问 aspnetdb 数据库。它当前正在使用集成身份验证(尝试使用 Web 服务器用于运行应用程序的身份登录)。

    以下示例使用集成身份验证。不过我会使用 SQL 身份验证。

    http://msdn.microsoft.com/en-us/library/ff649314.aspx

    【讨论】:

    • 如何创建sql账户?我没有安装 Sqlserver 2008。我正在使用随 VWD 2008 一起安装的 Sqlserver 2008 express edition。因此,没有查询分析器或企业管理器。
    • 安装 Microsoft SQL Server Management Studio Express microsoft.com/downloads/…
    【解决方案2】:

    我遇到了同样的问题,在进行调试后,我看到我正在为每个操作创建新的 DB 实体实例,并且创建新的 Db 实体实例意味着打开与 db 的新连接。

    下面是代码:

    Private tmpConnection As New DbModel.DbEntities
    

    因此,通过一次又一次地调用该变量,它会创建 DbEntites 的新实例并打开与 db 的新连接。

    所以我为此编写了一个小函数,这解决了我的问题。现在没有更多错误了。

    Private tmpConnection As DbModel.DbEntities
    
    Public Function dbCon() As DbModel.DbEntities
    
        If tmpConnection IsNot Nothing Then
    
            If tmpConnection.Connection.State = ConnectionState.Closed Then
    
                Try
                    tmpConnection.Connection.Open()
                    Return tmpConnection
                Catch ex As Exception
                    My.Response.Redirect("dberror.aspx")
                End Try
    
            Else
    
                Return tmpConnection
    
            End If
    
        Else
    
            tmpConnection = New DbModel.DbEntities
    
            Try
                tmpConnection.Connection.Open()
                Return tmpConnection
            Catch ex As Exception
                My.Response.Redirect("dberror.aspx")
            End Try
    
        End If
    
        Return Nothing
    End Function
    

    您的连接字符串中的最后一件事请添加“Connect Timeout=30;”

    这对我来说太完美了

    【讨论】:

      【解决方案3】:

      在每个操作上使用新的 DB 实体实例不应以物理方式创建与您的 SQL 服务器的连接。 Entity Framework 将使用为您的(进程、应用程序域、连接字符串)创建的连接池,如您的连接字符串中配置的那样,以避免创建新连接。

      这个问题非常环保,像下面这样调整参数(在你的 conn 字符串中)应该可以解决问题-

      最小池大小=1;

      最大池大小=100; // 默认

      连接超时=15; // 以秒为单位

      池化=真;

      【讨论】:

      • 这个答案为我做了。我将默认的Max Pool SizeConnection Timeout 参数值加倍。在此处完成信息:msdn.microsoft.com/en-us/library/… 在此之前,尽管我从 Windows 身份验证更改为 SQL Server 并确保 DTC 已启动并运行并允许远程客户端不能解决我的问题,但我认为它们也是必要的。
      【解决方案4】:

      在我的例子中,我使用的是 Sql CE,我的连接字符串是用绝对路径设置的,而不是在 |DataDirectory| 中。多变的。改变了这一点,它开始在服务器上工作。

      显然,它在开发机器上运行良好。

      【讨论】:

        【解决方案5】:

        在您提供的连接字符串中添加以下属性。

        <add 
             name="ASPNETDBEntities" 
             connectionString="metadata=res://*/Models.FriendList.csdl|
                               res://*Models.FriendList.ssdl|res://*/Models.FriendList.msl;
                               provider=System.Data.SqlClient;provider connection string=&quot;
                               Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF;
                               Integrated Security=True;Connect Timeout=30;
                               User Instance=True;
                               MultipleActiveResultSets=True&quot;" 
             ProviderName="System.Data.EntityClient" 
             User Instance="False"/>
        

        【讨论】:

        • 假设您对“以下属性”的非常模糊的引用(您指的是哪一个?)是MultipleActiveResultSets=True,它对我不起作用
        【解决方案6】:

        也许现在回答为时已晚,但我遇到了同样的问题。

        我添加了范围超时(5 分钟)。我举个例子。

        Dim varIntervalo As New TimeSpan(0, 5, 0)
        Using varTransaccion As New TransactionScope(TransactionScopeOption.Required, varIntervalo)
            For vari As Integer = 2 To varMatrizDatos.GetUpperBound(0)
                Dim varWhateverAs New TABLE
                varWhatever.ID_TABLE = something
                varWhatever.DESC_TABLE = something else
                varWhatever.DATE_TABLE = CDate(Now.Date)
        
                varEntidades.AddToTABLESet(varWhatever)
                varEntidades.SaveChanges()
            Next
            varTransaccion.Complete()
        End Using
        

        也许这段代码可以改进。

        【讨论】:

          【解决方案7】:

          此外,当您要操作的表被删除或不存在时,会引发此异常

          【讨论】:

            【解决方案8】:

            当有任何可能导致您的连接字符串无效时,似乎会引发此异常。无效的凭据是我的原因。

            【讨论】:

              【解决方案9】:

              我遇到了类似的问题,我也在使用 IIS。我打开一个命令窗口并输入iisreset。问题解决了。

              【讨论】:

                【解决方案10】:

                当在 ServerExplorer 中添加数据库作为 Windows 身份验证时,会出现此问题。当您在 ServerExplorer 中添加数据库时使用 sql 身份验证时,问题就解决了。如果仍在使用 Windows 身份验证并避免此异常,请在 webconfig 文件的连接字符串中提供数据库的用户 ID 和密码。

                只有当我们在 IIS 中托管服务时才会出现此问题

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-05-12
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-10-23
                  相关资源
                  最近更新 更多