web-dev-qa-db-fra.com

Entity Framework: "Le fournisseur sous-jacent a échoué à l'ouverture" 

Lorsque j'essaie d'insérer un enregistrement, le message d'erreur suivant s'affiche: Le fournisseur sous-jacent a échoué sous Open . Cette erreur se produit uniquement avec IIS et non avec le serveur Web de VWD 2008. Dans EventViewer, l'erreur d'application suivante apparaît: Impossible de générer une instance d'utilisateur de SQL Server en raison d'un échec du démarrage du processus pour l'instance d'utilisateur. La connexion sera coupée. [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" />

J'utilise un fichier aspnetdb.mdf, et pas une base de données externe. J'ai assez cherché pour ça, mais ça ne sert à rien.

Tout fonctionne bien avec le serveur Web VWD

17
pokrate

Vous devez créer un compte SQL pour que votre serveur Web puisse accéder à la base de données aspnetdb. Il utilise actuellement l'authentification intégrée (tente de se connecter avec l'identité utilisée par le serveur Web pour exécuter l'application).

L'exemple ci-dessous utilise l'authentification intégrée. J'utiliserais l'authentification SQL cependant.

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

10
Raj Kaimal

J'avais le même problème et après avoir fait le débogage, j'ai constaté que je créais la nouvelle instance de DB Entity à chaque action et que je créais une nouvelle instance de Db Entity, ce qui signifie l'ouverture d'une nouvelle connexion avec db.

Ci-dessous le code:

Private tmpConnection As New DbModel.DbEntities

donc en appelant la variable encore et encore sa création nouvelle instance de DbEntites et en ouvrant une nouvelle connexion à db.

donc j'écris une petite fonction pour ceci et cela a résolu mon problème. Maintenant plus d'erreur.

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

et dernière chose dans votre chaîne de connexion, ajoutez "Connect Timeout = 30;"

c'est travailler si parfait pour moi

3
Adeel Rizvi

L'utilisation d'une nouvelle instance d'entité de base de données pour chaque action ne doit pas créer physiquement de connexion à votre serveur SQL. Entity Framework utilisera le pool de connexions créé pour votre (processus, domaine d'application, chaîne de connexion) tel que configuré dans votre chaîne de connexion afin d'éviter la création de nouvelles connexions.

Ce problème est très environnemental et modifier les paramètres (dans votre chaîne de commandes) comme ci-dessous devrait résoudre le problème.

Taille minimale de la piscine = 1;

Taille maximale de la piscine = 100; // défaut

Délai de connexion = 15; // en secondes

Pooling = true;

2
Suneet Nangia

Dans mon cas, j’utilisais Sql CE et ma chaîne de connexion était configurée avec un chemin absolu dans le répertoire | DataDirectory | variable. Cela a changé et cela a commencé à fonctionner sur le serveur. 

Évidemment, cela a bien fonctionné sur la machine de développement. 

1
Brady Moritz

Ajoutez l'attribut ci-dessous dans la chaîne de connexion que vous avez indiquée.

<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"/>
0
solairaja

Cette exception semble être levée lorsqu'il y a quoi que ce soit qui pourrait rendre votre chaîne de connexion invalide. Les informations d'identification non valides ont été la cause pour moi.

0
Echilon

Peut-être qu'il est trop tard pour répondre mais j'ai eu le même problème.

J'ai ajouté un délai d'expiration de la portée (5 minutes). Je laisse un exemple.

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

Peut-être que ce code pourrait être amélioré.

0
Sebastián

J'avais un problème similaire et j'utilise également IIS. J'ai ouvert une fenêtre de commande et saisi iisreset. Problème résolu.

0
NightOwl888

Ce problème survient lorsque la base de données est ajoutée à ServerExplorer en tant qu'authentification Windows. Lorsque vous utilisez l'authentification SQL au moment de l'ajout de la base de données dans ServerExplorer, le problème est résolu. Si vous utilisez toujours l'authentification Windows et évitez cette exception, indiquez l'ID utilisateur et le mot de passe de la base de données dans connectionstring dans le fichier webconfig.

Ce problème ne se pose que lorsque nous hébergeons le service dans IIS

0
Jagadesh

De plus, cette exception est levée lorsque la table que vous allez manipuler est supprimée ou n'existe pas.

0
user1187019