Exception EF 4.1 «Le fournisseur n'a pas renvoyé de chaîne ProviderManifestToken»

88

J'essaye de reproduire un exemple trouvé sur MSDN. J'utilise ASP.NET et EF 4.1 (CTP?). J'ai utilisé NuGet pour installer le package EntityFramework.

J'obtiens cette erreur: The provider did not return a ProviderManifestToken string... et la base de données n'est jamais créée.

Voici ma chaîne de connexion:

<add name="HospitalContext"
   connectionString=
   "data source=.\SQLExpress;initial catalog=NewTestDB;integrated security=True;"
   providerName="System.Data.SqlClient"/>

Voici mon code:

var pat = new Patient { Name = "Shane123132524356436435234" };
db.Patients.Add(pat);

var labResult = new LabResult { Result = "bad", Patient = pat };

int recordAffected = db.SaveChanges();

Voici mon contexte:

public class HospitalContext : DbContext
{
    static HospitalContext()
    {
        Database.SetInitializer(new HostpitalContextInitializer());
    }

    public DbSet<Patient> Patients { get; set; }
    public DbSet<LabResult> LabResults { get; set; }
}

public class HostpitalContextInitializer :
             DropCreateDatabaseIfModelChanges<HospitalContext>
{
    protected override void Seed(HospitalContext context)
    {
        context.Patients.Add(new Patient { Name = "Fred Peters" });
        context.Patients.Add(new Patient { Name = "John Smith" });
        context.Patients.Add(new Patient { Name = "Karen Fredricks" });
    }
}

Il s'agit d'un système SQL 2008 entièrement corrigé, avec VS 2010 SP1.

bugnuker
la source
Il semblerait qu'après avoir ajouté [Key] au modèle, son fonctionnement a dépassé ce problème. Je suis toujours avec un autre problème, mais cela pourrait avoir résolu cela.
bugnuker
Aussi, il se peut que j'ai ajouté "Sécurité intégrée = true" à ma chaîne de connexion ...
bugnuker
J'ai la même exception lorsque je travaille avecSqlServerCe.Entity.dll
Nano Taboada
2
Dans l'intérêt des choses qui peuvent évoquer cette exception - je passe 20 minutes à regarder au-delà de la faute de frappe dans le nom de la chaîne de connexion qui doit correspondre au nom du contexte.
justSteve

Réponses:

184

J'obtenais cette erreur et j'ai essayé quelques-unes des suggestions précédentes. Ensuite, j'ai vérifié l'exception interne et j'ai remarqué que j'obtenais un simple échec de connexion SQL pour l'utilisateur. Juste autre chose à vérifier.

junken
la source
Dans mon cas, le mot de passe du serveur SQL a expiré
mklein
3
Merci de m'avoir pointé dans la bonne direction. Mon service SQL Express n'a pas été démarré - duh!
camainc
Bonne exception intérieure ... j'avais mal le nom de ma base de données quand j'ai pointé EF vers un nouvel emplacement de sauvegarde ... chose drôle, j'ai vérifié l'InnerEx et votre commentaire m'a fait revenir en arrière et le relire ... bravo!
Andy Danger Gagne
Utilisait la sécurité intégrée, IIS AppPool n'avait pas les droits nécessaires.
Vincent Vancalbergh
+1 - (Mon adresse IP personnelle a changé) Message d'erreur: Impossible d'ouvrir le serveur 'SERVERNAME' demandé par la connexion. Le client avec l'adresse IP «MY_OLD_IP» n'est pas autorisé à accéder au serveur. Pour activer l'accès, utilisez le portail SQL Azure ou exécutez sp_set_firewall_rule sur la base de données master pour créer une règle de pare-feu pour cette adresse IP ou cette plage d'adresses. La prise d'effet de cette modification peut prendre jusqu'à cinq minutes. \ R \ nLa connexion a échoué pour l'utilisateur 'MYADMINACCT'. \ R \ nCette session a reçu un ID de suivi de 'GUID'. Fournissez cet ID de suivi au support client lorsque vous avez besoin d'aide. "}
Dylan Hayes
8

Cela peut parfois se produire lorsque vous placez la chaîne de connexion dans le fichier app.config du mauvais projet dans Visual Studio.

Par exemple, j'ai eu ce problème dans le projet EF 4.1 (la version publiée) + le projet WCF Data Service et j'ai remarqué que je n'avais pas de chaîne de connexion spécifiée dans le projet Data Services, où il était utilisé.

Preet Sangha
la source
C'était ma solution. J'ai dû mettre la chaîne de connexion appropriée dans le projet de démarrage.
MickJuice
5

J'avais la même erreur, et en fait, la connexion a échoué pour le serveur spécifié. J'ai supprimé l'attribut "Sécurité intégrée" de la chaîne de connexion de configuration et cela a fonctionné.

Rakesh Singh
la source
Cela a fonctionné pour moi. Toute autre personne ayant ce problème devrait essayer ceci si les autres solutions ne fonctionnent pas.
Justin
Cette erreur s'est produite lorsque le service SQL Express a été désactivé sur ma machine.
John M
4

J'ai eu le même problème, et j'ajoute le code ci-dessous juste après l'instance de mon contexte (à charger par exemple)

context.Database.Connection.ConnectionString = @"Data Source=.\SQLExpress;Initial Catalog=Test;Integrated Security=True";
toto123
la source
4

J'ai eu un problème similaire avec l'application MvcMusicStore. J'ai changé une ligne dans le Web.config de "Instance = true" à "Instance = false". Cela fonctionne parfois sans cette modification, mais je ne sais pas ce qui cause la différence. La lecture de ce http://msdn.microsoft.com/en-us/library/ms254504.aspx n'a pas vraiment aidé.

Xuvion
la source
Incroyable ... c'était la bonne solution pour moi. Je ne sais pas pourquoi.
Kees C. Bakker
2

Par une certaine raison d'autorisation, EF ne peut pas créer de connexion à la base de données. J'avais fait face au même problème en une seule journée. Enfin, j'avais essayé la solution suivante et cela a fonctionné: a / Ouvrez IIS (j'utilise IIS 7) b / Ouvrez les paramètres avancés de l'appool que le site Web utilisait (Ex: DefaultAppPool) c / Regardez le groupe de modèle de processus, changez la valeur d'identité vers "Système local"

J'espère que cela fonctionnera avec vous.

Telvin Nguyen
la source
2

J'avais juste le même problème ...
la solution qui a fonctionné pour moi était:
exécutez l'outil de configuration du réseau client (tapez cliconfg dans Run)
et assurez-vous que TCP / IP est activé.

user1168945
la source
2

Je l'ai finalement craqué - après une légère chasse à l'oie sauvage pensant que c'était dû à des autorisations.

Révélation: UTILISER LE PROFILER SQL

(Remarque: j'ai récemment rétrogradé de EF6 à EF5)

En utilisant SQL Profiler, j'ai rapidement trouvé le dernier SQL exécuté avant l'échec signalé:

SELECT TOP (1) 
[Project1].[C1] AS [C1], 
[Project1].[MigrationId] AS [MigrationId], 
[Project1].[Model] AS [Model]
FROM ( SELECT 
    [Extent1].[MigrationId] AS [MigrationId], 
    [Extent1].[Model] AS [Model], 
    1 AS [C1]
    FROM [dbo].[__MigrationHistory] AS [Extent1]
)  AS [Project1]
ORDER BY [Project1].[MigrationId] DESC

Eh bien, regardez ça - quelque chose à voir avec les migrations. Il cherche dans le __MigrationHistorytableau - que je n'avais même pas réalisé qu'il avait créé (j'avais déjà effacé les migrations dans mon CSPROJ) et effacé cela.

Je tire donc les lignes de cette table et vois qu'elle est liée à une version de produit spécifique (v6).

entrez la description de l'image ici

En fait, j'ai rétrogradé d'EF6 (que je n'avais pas l'intention d'installer en premier lieu) à EF5 (qui est plus compatible avec l'échafaudage) et cela lorsque les problèmes ont commencé.

Je suppose que la Model (<Binary data>)colonne n'est pas rétrocompatible - d'où l' The provider did not return a ProviderManifest instanceerreur car elle n'a pas pu la décoder.

Je n'avais rien à perdre et j'ai juste effacé complètement cette table et j'ai couru Update-Database -Verbose, puis j'étais de nouveau opérationnel.

Si vous êtes dans un environnement avancé ou déjà en production, effacer cette table n'est peut-être pas la solution, mais cela m'a permis de me remettre immédiatement au travail.

Simon_Weaver
la source
J'ai fini par abandonner complètement la table __MigrationsHistory et la rescaffolding avec Add-Migrationet Update-Database -Verbose -Force. voici une référence de commande coding.abel.nu/2012/03/ef-migrations-command-reference
Simon_Weaver
le point important étant qu'il ne s'agit pas uniquement d'une erreur d'autorisations
Simon_Weaver
1

En utilisant Visual Studio 11 Beta avec EF4.1 et ASP.NET MVC, j'ai presque tiré mes cheveux jusqu'à ce que je trouve

http://connect.microsoft.com/VisualStudio/feedback/details/740623/asp-net-mvc-4-default-connection-string-improperly-escaped

Pour résoudre mon problème, je suis allé dans Application_Start et j'ai changé

Database.DefaultConnectionFactory = new SqlConnectionFactory ("Data Source = (localdb) \ v11.0; Integrated Security = True; MultipleActiveResultSets = True");

à

Database.DefaultConnectionFactory = new SqlConnectionFactory ( @ "Data Source = (localdb) \ v11.0; Integrated Security = True; MultipleActiveResultSets = True");

GaTechThomas
la source
Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True");a été ajouté à ma Mainméthode, maintenant cela fonctionne comme un charme! Merci beaucoup.
rotgers
1

Cette erreur n'est présente que lorsque le fichier .edmx est ouvert et disparaît dès que le fichier est à nouveau fermé.

Cette citation de CodePlex , cela a fonctionné avec moi (Visual Studio 2013 / MVC 5)

Feras
la source
J'ai aussi travaillé avec moi. J'ai essayé de fermer et de rouvrir le fichier edmx. Travaillé.
Rohit
1

Une autre chose à considérer si vous utilisez EF Code First est qu'il ne crée parfois pas automatiquement la base de données de sauvegarde dans votre classe DbContext. La solution consiste à ajouter votre propre chaîne de connexion - vous pouvez utiliser la chaîne de connexion qui peut être présente pour gérer la base de données utilisateur / enregistrement qui soutient le fournisseur d'appartenance simple, en tant que modèle. Enfin, vous devrez ajouter un constructeur par défaut pour la classe DbContext que vous avez créée:

public ChaletDb():base("ChaletConnection")
    {

    }

Ici, le nom de la chaîne de connexion que vous avez entré dans votre fichier web.config est utilisé pour diriger le DbContext pour créer la base de données. Très rarement, j'ai dû créer manuellement la base de données (dans SQL Server Management Studio), ce qui l'a incitée à fonctionner.

John Kelleher
la source
0

J'ai plusieurs projets dans une solution et j'ai ajouté EF à chaque projet à des moments différents. Sur certaines machines, cela fonctionnait et sur d'autres, il a échoué avec l'erreur susmentionnée. Il m'a fallu un certain temps pour remarquer que certains app.config de mon projet avaient ceci:

    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="v11.0" />
  </parameters>
</defaultConnectionFactory>

C'est correct si vous utilisez LocalDb (nouveau "sql express" comme), mais complètement faux si vous n'avez pas ce serveur spécifique installé et utilisez un SQL standard.

Solution: supprimez le code ci-dessus.

Oleg K
la source
0

Cela est dû au fait que la connexion au serveur SQL a échoué.

Assurez-vous que le compte d'utilisateur sous lequel vous exécutez le processus a accès à SQL Server.

Si vous avez généré le DbContext à partir du thread parent (comme l'utilisation de l'injection de dépendances), puis si vous empruntez l'identité d'un autre utilisateur, cette erreur se produit. La solution serait de générer le DbContext à l'intérieur du nouveau thread ou du nouveau contexte d'emprunt d'identité.

justcoding121
la source
0

Je viens de fermer toutes les instances de Visual Studio et de rouvrir ma solution.

Je ne sais pas ce qui s'est réellement passé, mais j'ai eu la même solution ouverte à partir de deux espaces de travail locaux différents (l'un avec mes modifications locales, l'autre avec le code source du référentiel inchangé). Je travaille avec une base de données postgres, Entity Framework 6, Visual Studio 2013 et ASP.NET MVC 5.

Mec Pascalou
la source
0

J'ai eu une erreur pour le cadre d'entité, mais aucune des réponses ci-dessus n'a fini par s'intégrer dans la solution qui a finalement fonctionné.

Mes premiers modèles de code EntityFramework et DataContext étaient dans un projet distinct de mon projet principal WebAPI. Mon projet Entity Framework quelque part sur la ligne de codage a été défini comme projet de démarrage et par conséquent, lorsque j'exécutais une migration, j'obtenais «Le fournisseur n'a pas renvoyé de chaîne ProviderManifestToken» ... problème de connexion.

Il s'avère que puisque la ConnectionString à la base de données se trouve dans le fichier Web.config du projet WebAPI Main, que lorsque j'exécutais une migration, la chaîne de connexion n'était pas récupérée. En définissant le projet WebAPI comme mon startProject, j'ai pu me connecter avec succès.

Ninja sans sommeil
la source