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="
Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF;
Integrated Security=True;
Connect Timeout=30;
User Instance=True;
MultipleActiveResultSets=True""
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
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.
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
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;
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.
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="
Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF;
Integrated Security=True;Connect Timeout=30;
User Instance=True;
MultipleActiveResultSets=True""
ProviderName="System.Data.EntityClient"
User Instance="False"/>
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.
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é.
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.
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
De plus, cette exception est levée lorsque la table que vous allez manipuler est supprimée ou n'existe pas.