Mot clé non pris en charge: "source de données" initialisant le contexte Entity Framework

161

J'initialise le contexte de l'objet Entity Framework, et cela me donne l'erreur de mot clé non pris en charge:

metadata=res://*/MainDB.csdl|res://*/MainDB.ssdl|res://*/MainDB.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Workspace\vs\Leftouch\Leftouch.Web\Data\Leftouch.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;App=EntityFramework"

J'ai pris la chaîne de connexion directement à partir de web.config qui fonctionnait et je n'ai modifié que le chemin d'accès au fichier (que j'ai défini dynamiquement), et au lieu d'utiliser la valeur par défaut, j'ai utilisé cette chaîne de connexion explicitement. Qu'est-ce qui pourrait causer cette erreur?

Can Poyrazoğlu
la source
2
Veuillez consulter stackoverflow.com/questions/6003085/… pour une approche différente
LCJ
1
Je ne sais pas qui a inventé ça metadata=res:, alors res=somethingelseavec "une syntaxe partout - mais ils devraient être vraiment heureux de ne pas être dans la même pièce que moi en ce moment: - /
Simon_Weaver
2018 Erreur de syntaxe similaire .Net EF Core - providerName n'était pas nécessaire par une chaîne de connexion SqlClient. Pas de guillemets ni de graduations dans la chaîne pour le noyau EF.
Sql Surfer

Réponses:

322

La vraie raison pour laquelle vous obtenez cette erreur est à cause des "valeurs de votre chaîne de connexion.

Si vous les remplacez par des guillemets simples, cela fonctionnera très bien.

https://docs.microsoft.com/archive/blogs/rickandy/explicit-connection-string-for-ef

(Publié pour que les autres puissent obtenir le correctif plus rapidement que moi.)

Vaccano
la source
1
Si vous transmettez la chaîne de connexion à la classe ObjectContent, assurez-vous qu'elle contient des guillemets simples. Si vous obtenez la connexion à partir du fichier .config, vous pouvez utiliser le & quot; séquence d'échappement.
Mike Stonis
C'est ce qui m'a résolu.
GiddyUpHorsey
Pour ceux d'entre vous qui ne sont pas familiers avec le fonctionnement de XML, "est une séquence d'échappement pour un guillemet car il s'agit d'un caractère réservé dans XML.
Vivian River
1
Merci son travail maintenant
Shivam Srivastava
System.Data.EntityClient.EntityConnectionStringBuilder l'a fait pour moi, merci.
AFract
37

J'ai résolu ce problème en EntityClientrevenant à SqlClient, même si j'utilisais Entity Framework.

Ma chaîne de connexion complète était donc au format:

<add name="DefaultConnection" connectionString="Data Source=localhost;Initial Catalog=xxx;Persist Security Info=True;User ID=xxx;Password=xxx" providerName="System.Data.SqlClient" />
Sauvage
la source
2
A travaillé pour moi! +1
Yury Kerbitskov
6
Le changement ci-dessus entraînera potentiellement (comme dans mon cas) l'erreur suivante "Le contexte est utilisé en mode Code First avec du code généré à partir d'un fichier EDMX pour le développement de Database First ou Model First"
Psi-Ed
Vous pouvez commenter lancer une nouvelle UnintentionalCodeFirstException () dans OnModelCreating (), mais cela ressemble à une solution de contournement sale
Alexander Ulmaskulov
14

Cela semble manquer le providerName="System.Data.EntityClient"bit. Vous avez tout compris?

Craig Stuntz
la source
Ok, c'était un autre attribut, j'ai oublié celui-là. Ajouté maintenant, il est metadata=res://*/MainDB.csdl|res://*/MainDB.ssdl|res://*/MainDB.msl;provider=System.Data.SqlClient;provider name=System.Data.EntityClient;provider connection string=&quot;{0};App=EntityFramework&quot;et il dit maintenant clé non trouvée: nom du fournisseur. J'ai aussi essayé providerName=...au lieu de provider name=trop, mais pas de chance.
Can Poyrazoğlu
2
Eh bien, j'ai commencé à le créer en utilisant la EntityConnectionStringBuilderclasse, et bizarrement, cela fonctionne maintenant. Mais je ne sais toujours pas pourquoi il n'acceptait pas ma chaîne, même avec vos ajouts.
Can Poyrazoğlu
3

Croyez-le ou non, renommer LinqPad.exe.config en LinqPad.config a résolu ce problème.

Sameer Alibhai
la source
12
C'est Microsoft, tout peut arriver!
Altaf Patel
Cela n'a pas de sens. Qu'est-ce que Linqpad a à voir avec la question et comment renommer un exécutable peut-il être utile?
Gert Arnold
Eh bien, cette erreur particulière s'est produite avec Linqpad dans mon cas et cela l'a résolue. Et je n'ai pas renommé l'exécutable. J'ai renommé le .exe.config en .config.
Sameer Alibhai
Quoi qu'il en soit, c'est un scénario très spécifique. Cela ajoute seulement du bruit car cela n'explique rien,
Gert Arnold
1

Utilisez simplement \ "à la place", cela devrait résoudre le problème.

Nilesh Moradiya
la source
1

Assurez-vous que vous avez Data Sourceet non DataSourcedans votre chaîne de connexion. L'espace est important. Croyez-moi. Je suis un idiot.

Hairgami_Master
la source