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

18
当我尝试插入一条记录时,出现了这个错误:未能打开基础提供程序。 此错误仅在IIS中发生,而不是VWD 2008的Web服务器上发生。 在EventViewer中,我得到了这个应用程序错误:由于无法启动用户实例进程而无法生成SQL Server用户实例。连接将被关闭。[CLIENT:]
<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 Web服务器上一切正常运作。

10个回答

11

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

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

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


如何创建一个SQL账户?我没有安装Sqlserver 2008。我正在使用随VWD 2008一起安装的Sqlserver 2008 Express Edition。因此,没有查询分析器或企业管理器。 - pokrate

3

我遇到了同样的问题,在进行调试后,我发现我在每个操作中创建了新的DB Entity实例,而创建新的Db Entity实例意味着与数据库打开新的连接。

以下是代码:

Private tmpConnection As New DbModel.DbEntities

通过反复调用变量,它会创建新的DbEntites实例并打开到数据库的新连接。

因此我编写了一个小函数来解决这个问题。现在不再出现错误。

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

对我来说非常完美地起作用


2

在每个操作中使用新的DB Entity实例不应该直接创建到SQL服务器的连接。Entity Framework会使用为您配置的(进程,应用程序域,连接字符串)的连接池来避免创建新的连接。

这个问题非常依赖环境,调整以下连接字符串中的参数可以解决问题:

Min Pool Size=1;

Max Pool Size=100; // 默认值

Connect Timeout=15; // 单位为秒

Pooling=true;


这个答案对我有用。我将默认的“最大池大小”和“连接超时”参数值加倍。完整信息在此处:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring(v=vs.110).aspx。在此之前,我从Windows身份验证更改为SQL Server,并确保DTC正在运行并允许远程客户端,但这并没有解决我的问题,但我认为它们也是必要的。 - John Donnelly

1
在我的情况下,我使用的是Sql CE,并且我的连接字符串设置为绝对路径而不是|DataDirectory|变量。更改后,在服务器上开始工作。
显然,在开发机器上它运行良好。

0
请在您提供的连接字符串中添加以下属性。
<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,但它对我没有起作用。 - Ortund

0

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


0

这个问题出现在将数据库添加到ServerExplorer时使用Windows身份验证的情况下。当您在ServerExplorer中添加数据库时使用SQL身份验证,问题就会得到解决。如果仍然使用Windows身份验证并避免此异常,请在webconfig文件中的连接字符串中提供数据库的用户ID和密码。

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


0
也许已经太晚回答了,但我遇到了相同的问题。 我增加了作用域超时(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

也许这段代码可以改进。


0
此外,当要操作的表被删除或不存在时,会抛出此异常。

0

这个异常似乎是在任何可能导致连接字符串无效的情况下抛出的。对我来说,无效的凭据是原因。


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