Aucune chaîne de connexion nommée «MyEntities» n'a pu être trouvée dans le fichier de configuration de l'application


246

J'utilise le framework d'entité et ASP.NET MVC 4 pour créer une application

Ma solution est divisée en deux projets;

  • Une bibliothèque de classes qui inclut mon fichier de modèle de données (.edmx) et quelques interfaces personnalisées
  • Le projet MVC «conteneur» qui fait référence à la bibliothèque de classes ci-dessus

Mon problème est que lorsque j'essaie d'utiliser le DbContext ' MyEntites ' j'obtiens l'erreur suivante:

Aucune chaîne de connexion nommée «MyEntities» n'a pu être trouvée dans le fichier de configuration de l'application.

Je suppose que le problème a quelque chose à voir avec le fait que la chaîne de connexion se trouve dans l'app.config de la bibliothèque de classes plutôt que dans le projet MVC.

Est-ce que quelqu'un a des suggestions?


15
Pas exactement le même contexte que le vôtre (migrations automatiques avec EF6) mais j'ai eu le même problème avec un message d'erreur similaire lorsque j'ai créé une branche enfant sur TFS et commencé à y travailler. Marquer le projet mvc comme projet de démarrage a résolu ce problème. sortie PM> Update-Database -Verbose Using StartUp project 'xxxxx.Web.Home'. Using NuGet project 'xxxxx.Web.Home.Dal'. Specify the '-Verbose' flag to view the SQL statements being applied to the target database. Target database is: 'MovieDatabase-0.0.2' (DataSource: (LocalDb)\v11.0, Provider: System.Data.SqlClient, Origin: Configuration).
Objet mécanique

Réponses:


309

Essayez de copier la chaîne de connexions dans le fichier .config dans le projet MVC.


63
Fonctionne parfaitement mais aimerait savoir pourquoi le projet référencé n'utilise pas son propre fichier de configuration pour récupérer la chaîne de connexion.
Null Head

7
@Alexander Vieille question mais oui, j'aimerais aussi savoir pourquoi.
Kehlan Krumme

22
@Alexander, le framework charge et utilise le (s) fichier (s) de configuration pour l'assembly en cours d'exécution. Dans ce cas, c'est le projet web. Les bibliothèques de classes n'ont généralement pas leurs propres fichiers de configuration.
kiprainey

24
Les commandes Enable-Migration, lorsqu'elles sont exécutées dans le contexte de la NuGet COnsole, examinent le fichier de configuration des projets de démarrage, pas nécessairement le projet dans lequel vous pensez qu'il se trouverait. Définissez simplement le projet avec le fichier app.config que vous souhaitez être le démarrage projet. Facultativement, stockez vos chaînes de connexion dans un fichier de configuration, puis référencez-les dans d'autres projets en <connectionString configSource = "../ ProjectDir / SharedConnections.config" />
Ryan Mann

3
J'ai reçu ce message d'erreur exact, mais mon fichier .config - dans le bon projet - a en effet répertorié la chaîne de connexion correcte. Cependant, j'utilisais des transformations, et la chaîne de connexion n'était bien sûr pas référencée dans le fichier .config transformé. C'est donc quelque chose à surveiller si vous utilisez des transformations de fichier de configuration.
Morten Nørgaard

143

Vous avez raison, cela se produit car la bibliothèque de classes (où se trouve le fichier .edmx) n'est pas votre projet de démarrage / principal.

Vous devrez copier la chaîne de connexion dans le fichier de configuration du projet principal.

Dans le cas où votre projet de démarrage / principal n'a pas de fichier de configuration (comme c'était le cas dans mon cas d'application de console), ajoutez-en un (projet de démarrage - Ajouter un nouvel élément -> Fichier de configuration d'application).

Plus d'informations pertinentes peuvent être trouvées ici: MetadataException: impossible de charger la ressource de métadonnées spécifiée


8
La réponse clé à cela est que la bibliothèque de classes (où se trouve le fichier .edmx) n'est pas votre projet STARTUP. J'ai réalisé que mon projet de démarrage n'était pas défini sur le projet dans lequel mon web.config était installé. C'était une application console avec un autre app.config. Donc, si vous ajoutez des applications de console à votre solution Web, assurez-vous que votre projet Web est le projet de démarrage lorsque vous exécutez update-database!
Karl

1
J'ai déchargé mon projet principal pour une raison quelconque et après l'avoir rechargé, j'ai eu cette erreur en essayant d'ajouter des migrations. Faire à nouveau le projet de démarrage du projet principal a résolu le problème. Merci @Oren
Azadrum

2
Mon projet de démarrage a été modifié par erreur. C'est l'élément clé. Votre réponse a vraiment aidé!
Fabio Milheiro

98

assurez-vous que vous faites votre projet (avec le DbContext) comme démarrage

sur le projet, faites un clic droit et sélectionnez

OU

Ajoutez au projet défini comme démarrage votre chaîne de connexion dans app.config (ou web.config)

OU

Appelez la commande comme ceci

Update-Database -Script -ProjectName '<project name>' -StartupProjectName '<project name>' -ConnectionString 'data source=.;initial catalog=<db name>;integrated security=True;MultipleActiveResultSets=True' -ConnectionProviderName 'System.Data.SqlClient'

Puis réessayez


2
C'est en fait que le projet contient la chaîne de connexion doit être définie comme projet de démarrage, et généralement ce n'est pas le projet que votre fichier DbContext se trouve
Raymond Wang

1
... ainsi, en plus de s'assurer que le Package Mgr cible la bonne couche, cette même couche doit être Set as Startup Project- comme le montre la capture d'écran ci-dessus. (même si vous touchez F5, vous ne pourrez pas démarrer la bibliothèque de classes)
bkwdesign

3
Cela m'a sauvé la vie. Même si dans le gestionnaire de packages, le projet par défaut était défini sur le projet dans lequel le contexte était défini, il ne remplaçait toujours pas.
garfbradaz

1
"Mais ça a marché hier! La même commande !" => CECI!
Simon_Weaver

1
Le moyen le plus simple =)
Alexandr

29

Vous pouvez simplement passer la chaîne de connexion à EntityFrameworket continuer votre vie:

public partial class UtilityContext : DbContext
{
    static UtilityContext()
    {
        Database.SetInitializer<UtilityContext>(null);
    }

    public UtilityContext()
        : base("Data Source=SERVER;Initial Catalog=DATABASE;Persist Security Info=True;User ID=USERNAME;Password=PASSWORD;MultipleActiveResultSets=True")
    {
    }

    // DbSet, OnModelCreating, etc...
}

et fait ma journée aussi parce que je ne pouvais pas trouver de solution pour laquelle mon projet de démarrage avait soudainement arrêté de trouver le fichier de configuration. Mon app.config et <appname> .exe.config apparaissaient dans mon bac de projet de démarrage et pourtant EntityFramework n'a pas pu trouver la chaîne de connexion que j'utilisais depuis toujours. J'ai supprimé un certain nombre de projets inutilisés récemment de la solution et je me demande si cela a quelque chose à voir avec cela. J'ai supprimé un projet Web de la solution. Vous vous demandez si mes autres projets reposaient sur le web.config ou quelque chose d'inhabituel comme ça.
GrayDwarf

La configuration du projet en cours est utilisée par tous les autres projets enfants.
Serj Sagan

1
mais comment définir le nom du fournisseur?
FizxMike

9

Comme vous le supposez, cela concerne la chaîne de connexion se trouvant dans app.config de la bibliothèque de classes.

Copiez l'entrée de la classe app.config dans le conteneur app.configou le web.configfichier


8

Si vous avez plusieurs projets en solution, configurez le projet comme démarré là où vous avez votre vérité App.config.


7

copiez la chaîne de connexion app.configou le web.configfichier dans le projet qui a été défini sur "Définir comme StartUpprojet" et si dans le cas de l'utilisation du framework d'entité dans le projet de couche de données - veuillez installer le nuget du framework d'entité dans le projet principal.


4

Cela se produit également si le projet de démarrage est remplacé par celui qui n'a pas les chaînes de connexion .

  1. Solution clic droit - cliquez sur les propriétés
  2. Sous Propriétés communes, sélectionnez le projet de démarrage
  3. Dans le volet droit, sélectionnez le projet qui a les chaînes de connexion (dans la plupart des cas, ce seront les projets MVC - le projet qui démarre la solution)

Oui cela fonctionne. J'ai créé une bibliothèque de classes pour EF pour communiquer avec la base de données et obtenais le même problème.
Satinder Sidhu

4
  1. Ajouter un fichier App.Config
  2. Définissez le projet comme projet de démarrage.
  3. Assurez-vous d'ajouter les chaînes de connexion après la entityFrameworksection:

    <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    
    </configSections>
    
    <connectionStrings>
       <!-- your connection string goes here, after configSection -->
    </connectionString>

3

Ouais, c'est idiot. Vous pouvez éviter de copier la chaîne de connexion en utilisant un générateur de connexion. Code VB.Net (utilisé en production, mais légèrement modifié ici, alors traitez comme non testé, heureux de vous aider en cas de problème), où j'ai une variable serverName, une variable databaseName, je les passe dans une méthode et je fais générer la connexion pour moi:

    Dim EfBuilder As New System.Data.EntityClient.EntityConnectionStringBuilder("metadata=res://*/VMware.VmEf.csdl|res://*/VMware.VmEf.ssdl|res://*/VMware.VmEf.msl;provider=System.Data.SqlClient;provider connection string=""data source=none;initial catalog=none;integrated security=True;multipleactiveresultsets=True;App=EntityFramework""")
   Dim SqlBuilder As New Data.SqlClient.SqlConnectionStringBuilder(EfBuilder.ProviderConnectionString)
                        SqlBuilder.DataSource = serverName
                        SqlBuilder.InitialCatalog = databaseName
                        EfBuilder.ProviderConnectionString = SqlBuilder.ConnectionString
                        Using vmCtx As New VmEfConn(EfBuilder.ConnectionString)

2

utilisez-vous plus d'un projet sur votre solution?

Parce que si vous l'êtes, la configuration Web que vous devez vérifier est celle du même projet que le fichier de .edmx


Oui, c'est le cas. Le projet qui contient la chaîne de connexion est une bibliothèque de classes qui comprend uniquement un fichier App.config. Le projet MVC ne semble pas vérifier ce point.
jjc99

lors du développement il ne chechera que l'app.config sur son projet, vous devez y ajouter
Diego

Merci pour votre réponse. J'ai essayé de copier la chaîne de connexion du projet contenant le fichier edmx et de la placer dans le fichier racine web.config de mon projet MVC. Malheureusement, il ne trouve toujours pas la chaîne de connexion. Dois-je modifier la chaîne de connexion de quelque manière que ce soit?
jjc99

C'est l'inverse. En temps de développement, vous avez besoin de la chaîne de con sur le fichier app.cofnig du projet contenant le fichier .edmx. Si vous l'avez peut-être le nom est faux. Le nom de la chaîne de connexions doit être le même que celui de la propriété "entity containr name" de votre fichier .edmx
Diego

1

Ajouter ConnectionString au fichier Web.config du projet MVC


1

J'ai rencontré ce problème lorsque j'utilise plusieurs projets, le projet de démarrage avec web.config et app.config pour le projet EntityFramework.

pour éviter ce problème, vous devez:

  1. Vous avez besoin de la chaîne de connexion dans le fichier * .config démarré.
  2. Vous devez avoir installé la DLL EntityFramework dans vos références

1

J'ai fait face au même problème. J'ai manqué de mettre une chaîne de connexion au projet de démarrage alors que j'effectue une opération d'accès aux données à partir d'une autre couche. également si vous n'avez pas app.config dans votre projet de démarrage, ajoutez le fichier app.config, puis ajoutez une chaîne de connexion à ce fichier de configuration.


1
Merci, j'ai eu un problème avec le chargement de mon projet et il a perdu le "Projet de démarrage". Votre réponse m'a rappelé que le projet avec le fichier de contexte et app.config était bien le démarrage.
Mastro

1

J'ai obtenu cela en n'ayant pas le projet défini comme démarrage, comme indiqué par une autre réponse. Ma contribution à cela - lorsque vous effectuez Add-Migrations et Update-Database, spécifiez le projet de démarrage dans le cadre de la commande dans Nuget Package Manager Console (n'incluez pas les caractères '[' ou ']', c'est juste pour vous montrer que vous besoin de changer le texte qui s'y trouve en nom de votre projet):

  1. Enable-Migrations
  2. Add-Migrations -StartupProject [le nom de votre projet qui contient la classe de contexte de données]
  3. Update-Database -StartupProject [même nom de projet que ci-dessus]

Ça devrait le faire.


De cette façon, vous pouvez inclure les commandes dans vos procédures et ne pas avoir à changer constamment le projet de démarrage par défaut.
JakeJ

1

C'est parce que votre classe de contexte est héritée de DbContext. Je suppose que votre ctor est comme ça:

public MyEntities()
    : base("name=MyEntities")

name=... doit être remplacé par le nom de votre connectionString


0

La chaîne de connexion générée par le projet contenant le fichier .edmx génère la chaîne de connexion, il semblerait que ce soit un résidu des types de fichiers app.config qui ont été copiés dans le répertoire de sortie et référencés par l'exécutable pour stocker les informations de configuration d'exécution.

Cela interrompt le projet Web car il n'y a pas de processus automatique pour ajouter des informations .config aléatoires dans le fichier web.config du projet Web.

Le plus simple est de copier la chaîne de connexion du fichier de configuration dans la section des connexions du fichier web.config et d'ignorer le contenu du fichier de configuration.


0

La meilleure façon que je viens de trouver pour résoudre ce problème est de définir temporairement ce projet (probablement une bibliothèque de classes) sur le projet de démarrage. Cela force la console du gestionnaire de packages à utiliser ce projet comme source de configuration. une partie de la raison pour laquelle il est configuré de cette façon est due au modèle descendant que les fichiers econfig suivent généralement. La règle générale est que le projet le plus proche du client (application MVC par exemple) est le web.config ou app.config qui sera utilisé.


0

Assurez-vous que vous avez placé la chaîne de connexion dans le ROOT web.config du projet de démarrage.

Je sais que je dis un peu l'évidence ici, mais cela m'est aussi arrivé - même si j'avais déjà la chaîne de connexion dans le Web.Config de mon projet MVC (le fichier .edmx a été placé dans un projet de bibliothèque de classe différent) et je ne pouvais pas ne sais pas pourquoi je continue à recevoir une exception ... Bref, j'ai copié la chaîne de connexion dans Views \ Web.Config par erreur, dans une étrange combinaison de fatigue et de non-défilement vers le bas de -le scénario de l'explorateur de solutions. Oui, ces choses arrivent aussi aux développeurs vétérans :)


0

Ce problème se produit lorsque vous utilisez des couches dans votre projet et que vous définissez ou installez le travail de trame d'entité dans DataLayer et essayez d'exécuter votre projet

Donc, pour surmonter ce problème, copiez la chaîne de connexion à partir de la couche où se trouve le fichier Edmx et collez la chaîne de connexion dans web.config principal.


0

Ajoutez une chaîne de connexion dans le fichier web.config racine du projet MVC «conteneur» qui référence la bibliothèque de classes comme suit:

 <connectionStrings>

  <add name="MyEntities" connectionString="complete connection string here" providerName="System.Data.SqlClient" />

  </connectionStrings>

Si vous ne souhaitez pas utiliser "MyEntities" comme nom de connexion, modifiez-le comme vous le souhaitez, mais apportez la modification suivante dans votre classe MyEntities DbContext:

MyEntities: DbContext
 {
   public MyEntities():base("Name-Of-connection-string-you wish to connect"){ }
 }

La raison de cette erreur est la suivante: si nous ne spécifions pas le nom de la chaîne de connexion ou connectons la chaîne dans la classe dérivée de DbConext (dans votre cas, il s'agit de MyEntities), alors DbContext recherchera automatiquement une chaîne de connexion dans le fichier racine web.config. Identique au nom de classe dérivé (dans votre cas, il s'agit de Mes entités).


0

J'ai eu ce problème lors de l'exécution de MSTest. Je ne pourrais pas le faire fonctionner sans le drapeau "noisolation".

J'espère que cela aide quelqu'un. Cela m'a coûté beaucoup de temps pour comprendre cela. Tout allait bien de l'IDE. Quelque chose de bizarre sur Entity Framework dans ce contexte.


0

Migrations régulières

Il y a deux options - la première que tout le monde a suggérée ici est de s'assurer que la chaîne de connexion se trouve dans le fichier Web.config du projet. Lorsque vous travaillez avec des chaînes de connexion à partir des paramètres d'application Azure, cela signifie remplacer vos valeurs Web.config par les valeurs Azure.

Azure ou migrations automatiques (programmatique)

Il existe une deuxième option disponible si vous exécutez des migrations par programme, qui vous permet d'exécuter des migrations à l'aide d'une chaîne de connexion obtenue dynamiquement (ou via les paramètres d'application Azure) sans la stocker dans Web.config:

Lors de la définition de TargetDatabase de la configuration , utilisez le constructeur DbConnectionInfo qui prend une chaîne de connexion et un nom de fournisseur au lieu du constructeur qui ne prend qu'un nom de connexion. Si votre chaîne de connexion n'a pas de nom de fournisseur et que vous utilisez SQL Server / Azure SQL, utilisez "System.Data.SqlClient"


0

Cela peut également entraîner un nombre insuffisant de références dll référencées dans le code appelant. Un petit hack maladroit pourrait vous sauver la journée.

Je suivais l'approche DB First et j'avais créé le fichier EDMX dans le projet de bibliothèque de classe DAL, et cela faisait référence à la bibliothèque de classe BAL, qui à son tour était référencée par un service WCF.

Depuis que j'obtenais cette erreur dans le BAL, j'avais essayé la méthode mentionnée ci-dessus pour copier les détails de la configuration depuis l'App.config du projet DAL, mais je n'ai pas résolu. En fin de compte avec la pointe d'un ami, je viens d'ajouter un fichier EDMX factice au projet WCF (avec la connectivité DB pertinente, etc.), il a donc importé tout le nécessaire, puis j'ai simplement supprimé le fichier EDMX, et il s'est juste débarrassé du problème avec une construction propre.


0

Il y a un commentaire sur la première réponse de @RyanMann qui suggère:

Stockez vos chaînes de connexion dans un fichier de configuration, puis référencez-les dans d'autres projets en <connectionString configSource="../ProjectDir/SharedConnections.config" />

Ceci est une suggestion fantastique!

Il fonctionne également pour partager des chaînes de connexion entre les fichiers App.config et Web.config!

Quiconque souhaite suivre cette suggestion doit se diriger vers cette réponse SO . Il contient un excellent guide étape par étape sur le partage de chaînes de connexion entre plusieurs projets dans une solution.

La seule mise en garde est qu'il configSourcedoit exister dans le même répertoire ou un sous-répertoire. Le lien ci-dessus explique comment utiliser "Ajouter en tant que lien" pour contourner ce problème.


0

J'ai eu cette erreur lors de la tentative d'utilisation d'EF dans un plugin AutoCAD. Les plug-ins CAO obtiennent la chaîne de connexion à partir du fichier acad.exe.config. Ajoutez la chaîne de connexion comme mentionné ci-dessus au fichier de configuration acad et cela fonctionne.

Nous remercions Norman.Yuan d'ADN.Network.


0

Si vous utilisez un modèle MVVM, essayez de copier les chaînes de connexion dans toutes les parties de votre projet.

Par exemple, si votre solution contient deux projets, le projet de bibliothèque de classes et le projet wpf, vous devez copier les chaînes de connexion du projet principal (projet de classe de bibliothèque) et en placer une copie dans le fichier App.config du projet wpf.

<connectionStrings>
  <add name="DBEntities" ... />
</connectionStrings>

J'espère que cela vous sera utile :)


-2

Ajouter Connectoinstrnig dans le fichier web.config

<ConnectionStiring> <add name="dbName" Connectionstring=" include provider name too"  ></ConnectionStiring>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.