实体框架:“基础提供商在Open上失败”

时间:2010-05-16 19:35:34

标签: asp.net entity-framework

当我尝试插入记录时,我收到此错误:基础提供程序在Open上失败。 仅在IIS而不是VWD 2008的Web服务器上发生此错误。 在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网络服务器

一切正常

10 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:3)

我遇到了同样的问题,在进行调试之后,我看到我在每个动作上创建了DB Entity的新实例,并且创建了Db Entity的新实例意味着打开与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;”

那对我来说非常完美

答案 2 :(得分:2)

在每个操作上使用数据库实体的新实例不应在物理上创建与SQL服务器的连接。实体框架将使用为连接字符串中配置的(进程,应用程序域,连接字符串)创建的连接池,以避免创建新连接。

这个问题非常环保,调整参数(在您的conn字符串中)如下所示应解决问题 -

最小池大小= 1;

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

连接超时= 15; //在几秒钟内

池=真;

答案 3 :(得分:1)

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

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

答案 4 :(得分: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"/>

答案 5 :(得分: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

也许这段代码可以改进。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

当有任何可能导致连接字符串无效的情况时,似乎会抛出此异常。凭证无效是我的原因。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

当ServerExplorer中的数据库作为Windows身份验证添加时,会出现此问题。在ServerExplorer中添加数据库时使用sql身份验证时,问题会解决。如果仍然使用Windows身份验证并避免此异常,请在webconfig文件中的connectionstring中提供数据库的用户标识和密码。

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