web-dev-qa-db-fra.com

Entity Framework Le fournisseur sous-jacent a échoué lors de l'ouverture

Ci-dessous ma chaîne de connexion:

connectionString = "metadata = res: //*/EDMX.Test.csdl | res: //*/EDMX.Test.ssdl | res: //*/EDMX.Test.msl; fournisseur = System.Data.SqlClient; fournisseur connection string = "Source de données = home_computer; Initial Catalogue = db_Test; informations de sécurité persistantes = True; utilisateur ID = testUser; Mot de passe = 1234 $; MultipleActiveResultSets = True ""

Voici le code où le programme s'est bloqué:

EDMX.TestingEntity context = new EDMX.TestingEntity();

var query = from t in context.User
            where t.UserName == _userName
            select t;

Après avoir exécuté le code ci-dessus, j'ai vérifié la requête de variable et trouvé une exception 

Le fournisseur sous-jacent a échoué lors de l'ouverture.

J'ai vérifié:

  1. La connexion entre le serveur et l'ordinateur est normale 
  2. Je peux me connecter à la base de données avec nom d'utilisateur testuser et avec le mot de passe $ 1234 
  3. J'ai vérifié les paramètres de sécurité dans la base de données (SQL Server) indiquant que l'autorisation a été accordée à testUser.

Pourquoi cette exception se produit-elle? J'utilise .net 4.5


Ajoutée:

J'ai réessayé, regardez l'exception interne et il s'agissait de: Une erreur liée au réseau ou spécifique à une instance s'est produite lors de l'établissement d'une connexion à SQL Server. Le serveur est introuvable ou inaccessible. Vérifiez que le nom de l'instance est correct et que SQL Server est configuré pour autoriser les connexions à distance. (fournisseur: fournisseur de canaux nommés, erreur: 40 - Impossible d'ouvrir une connexion à SQL Server)

Je sais que cela pourrait être un problème de réseau, mais j'ai désactivé le pare-feu du serveur et de mon ordinateur et essayé à nouveau, mais toujours sans succès.


Tout à l'heure, copié la chaîne de connexion dans un programme pour tester cette connexion et elle fonctionnait bien ..


Je viens d'annuler toutes les modifications et tester à nouveau et cela a fonctionné

28
User2012384

Cela ressemble à un problème de connexion. Vous pouvez utiliser les propriétés du lien de données pour déterminer si la connexion est correcte. Faites ce qui suit:

  1. Créez un bloc-notes vide et renommez-le "X.UDL"
  2. Double-cliquez pour l'ouvrir
  3. Dans l'onglet Connexions, choisissez le nom du serveur/entrez le nom .__
  4. Cliquez sur OK pour le sauvegarder. 

Ouvrez maintenant le fichier dans le Bloc-notes et comparez les propriétés de la chaîne de connexion.

40
Ramesh Sivaraman
  1. Recherchez "Services de composants" dans Programmes et fichiers
  2. Aller aux services
  3. Rechercher le service "Coordinateur de transactions distribuées"
  4. Faites un clic droit et redémarrez le service

Vous venez de redémarrer le service et le code devrait s'exécuter sans erreur

9
Vishal Saini

La solution possible est décrite dans cet astuce Code Project :

Comme mentionné par les gens IIS, les informations d'identification de l'utilisateur du service réseau lors de la tentative de connexion au serveur SQL. Il suffit donc de modifier les paramètres du pool d’applications dans votre IIS:

  1. Ouvrez Internet Information Service Manager
  2. Cliquez sur Pools d'applications dans l'arborescence de navigation de gauche.
  3. Sélectionnez votre pool de versions. Dans mon cas, j'utilise ASP .Net v4.0. Si vous ne possédez pas cette version, sélectionnez DefaultAppPool.
  4. Faites un clic droit sur l'étape 3 et sélectionnez les paramètres avancés.
  5. Sélectionnez Identité dans la fenêtre des propriétés et cliquez sur le bouton pour modifier la valeur.
  6. Sélectionnez Système local dans la liste déroulante Comptes intégrés et cliquez sur ok . C'est tout. Maintenant, lancez votre application. Tout fonctionne bien.
6
Ayaat Shifa

Nous avions une chaîne de connexion dans web.config avec Data Source=localhost, et il y avait cette erreur (MSSQL était sur le même ordinateur). Le changer en "DOMAINE\MACHINE" a aidé.

5
Rustem Mustafin

S'il vous plaît vérifier les choses suivantes en premier.

Lors de la génération de Edmx, vous auriez donné un nom à votre chaîne de connexion. qui entre dans la configuration de l'application du projet avec l'entité.

Avez-vous copié la même chaîne de connexion dans votre fichier de configuration principal . De plus, le nom doit être identique à celui que vous avez indiqué lors de la génération du fichier EDMX.

4
Vinay Pratap Singh

Toujours vérifier s'il y a une exception interne. Dans mon cas, Inner Exception s’est avéré très utile pour cerner le problème.

Mon site fonctionnait bien dans l'environnement de développement. Mais après mon déploiement en production, il a commencé à émettre cette exception, mais l’exception interne disait que l’ouverture de session avait échoué pour cet utilisateur.
J'ai donc compris que cela avait quelque chose à voir avec la connexion elle-même. Par conséquent essayé de vous connecter en utilisant SSMS et même cela a échoué.

Finalement découvert que cette exception est apparue pour la simple raison que le serveur SQL avait uniquement l'authentification Windows activée et que l'authentification SQL échouait, ce que j'utilisais pour l'authentification. 

En résumé, le passage de l’authentification en mixte (SQL et Windows) a résolu le problème pour moi. :)

4
Boney

Mon client a signalé cette erreur. J'ai trouvé qu'il jouait avec les fichiers * .ldf. Il a copié le fichier * ldf d'une base de données et l'a renommé pour correspondre à une deuxième base de données (que je lui ai demandé de placer dans un dossier).

J'ai reproduit le même scénario et j'ai obtenu la même erreur dans mon système de développement. Erreur corrigée après la suppression du (des) fichier (s) * ldf.

3
user3290439

J'ai constaté cette erreur lorsqu'un collègue tentait de se connecter à une base de données protégée par un réseau privé virtuel. L'utilisateur avait inconnu pour basculer vers un réseau sans fil qui n'avait pas d'accès VPN. Une façon de tester ce scénario consiste à voir si vous pouvez établir une connexion par un autre moyen, tel que SSMS, et si cela échoue également.

3
drobison

J'ai eu ce problème tout en continuant l'exécution d'un test unitaire qui appelle une méthode utilisant un traitement en parallèle. Je sais qu'il existe des parties d'EF qui ne sont pas thread-safe. Je me demande donc s'il s'agit d'un conflit où la connexion est ouverte. et fermé désynchronisé avec les opérations. 

Ma trace de pile a montré ceci:

     at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at System.Threading.Tasks.Task.Wait()
   at System.Threading.Tasks.Parallel.ForWorker[TLocal](Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Func`4 bodyWithLocal, Func`1 localInit, Action`1 localFinally)
   at System.Threading.Tasks.Parallel.ForEachWorker[TSource,TLocal](IList`1 list, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Action`3 bodyWithStateAndIndex, Func`4 bodyWithStateAndLocal, Func`5 bodyWithEverything, Func`1 localInit, Action`1 localFinally)
   at System.Threading.Tasks.Parallel.ForEachWorker[TSource,TLocal](IEnumerable`1 source, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Action`3 bodyWithStateAndIndex, Func`4 bodyWithStateAndLocal, Func`5 bodyWithEverything, Func`1 localInit, Action`1 localFinally)
   at System.Threading.Tasks.Parallel.ForEach[TSource](IEnumerable`1 source, Action`1 body)

C'est donc l'indice que j'ai suivi. Lorsque je suis retourné à un seul thread foreach au lieu de Parallel.ForEach, le problème a disparu. 

Joey

2
Joey Morgan

Pour moi, lorsque cela commence généralement, je dois installer un bureau à distance dans le service et au minimum redémarrer IIS. Il commence généralement à apparaître juste après le déploiement du code. À quelques rares occasions, j'ai dû redémarrer les services SQL et IIS. J'ai écrit un script de traitement par lots pour prendre un paramètre (1 ou 2) et le configurer pour redémarrer IIS (c'est-à-dire 1) ou utiliser le mode nucléaire (2). 

2
Kevin B Burns

J'ai eu cette erreur et cela a été causé par une faute de frappe dans la chaîne de connexion dans App.config.

1
user744621

J'obtiens souvent cette exception lors de l'exécution sur ma machine de développement, en particulier après avoir modifié le code, reconstruit le code, puis exécuté une ou plusieurs pages Web associées. Toutefois, le problème disparaît si je modifie le paramètre CommandTimeout à 120 secondes ou plus (par exemple, définissez context.Database.CommandTimeout = 120 avant l'instruction LINQ). Bien que cela ait été demandé à l'origine il y a 3 ans, cela peut aider quelqu'un qui cherche une réponse. Ma théorie est que VisualStudio prend du temps pour convertir les bibliothèques binaires construites en code machine et expire lorsque vous tentez de vous connecter à SQL Server après la compilation juste à temps.

1
Daniel

Dans mon cas, j'ai résolu le problème en ajoutant un mot de passe de connexion dans la chaîne de connexion.

Lors de la configuration du modèle EF, j'avais sélectionné l'option permettant d'exclure des données sensibles de la chaîne de connexion. Donc, le mot de passe n'était pas inclus initialement. 

1
Abhishek Poojary

Si vous utilisez un fichier .mdf local, Probablement un logiciel de synchronisation tel que Dropbox a tenté de synchroniser deux fichiers journaux (.ldf) Sur deux ordinateurs différents vous pouvez supprimer les fichiers journaux du répertoire bin et assurez-vous que les propriétés .mdf -> Copier dans le répertoire de sortie -> Copier si plus récent copieront le fichier de base de données sélectionné et son journal dans le répertoire bin .....!! Alert- si votre fichier de base de données n’a changé que dans le fichier. bin Directory tous les changements vont être supprimés!

0
Oamsalem

ouvrez le Gestionnaire de configuration SQL Server, puis cliquez sur les services du serveur SQL. Une liste s'affichera dans la liste. Cliquez avec le bouton droit sur le serveur SQL et cliquez sur Démarrer.

0
RafiO

Essayez ceci- Ouvrez la commande Invite en tant qu’administrateur et tapez cecinetsh Winsock reset

Redémarrez votre système et réessayez.

0
Amar Pawar