J'utilise framework d'entité et ASP.NET MVC 4 pour construire une application
Ma solution est divisée en deux projets.
Mon problème est que lorsque j'essaie d'utiliser "MyEntites" DbContext j'obtiens le message d'erreur suivant:
Aucune chaîne de connexion nommée 'MyEntities' n'a pu être trouvée dans le fichier 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 le fichier app.config de la bibliothèque de classes plutôt que dans le projet MVC.
Est-ce que quelqu'un a des suggestions?
Essayez de copier la chaîne de connexions dans le fichier .config du projet MVC.
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 principal du projet.
Si votre projet de démarrage/principal n’a pas de fichier de configuration (comme c’était dans le cas de ma console), ajoutez-en un (Projet de démarrage - Ajouter un nouvel élément -> Fichier de configuration de l’application).
Des informations plus pertinentes peuvent être trouvées ici: MetadataException: impossible de charger la ressource de métadonnées spécifiée
assurez-vous de faire votre projet (avec le DbContext) au démarrage
OR
Ajoutez au projet qui est défini au démarrage votre chaîne de connexion dans app.config (ou web.config)
OR
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éessaye
Vous pouvez simplement passer la chaîne de connexion à EntityFramework
et poursuivre 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...
}
Si vous avez plusieurs projets en solution, définissez le projet comme étant démarré là où vous avez votre vérité App.config.
Comme vous le supposez, il s'agit d'une chaîne de connexion figurant dans app.config de la bibliothèque de classes.
Copiez l'entrée de la classe app.config dans le fichier app.config
ou web.config
du conteneur.
copier la chaîne de connexion dans un fichier app.config ou web.config dans un projet défini sur "Définir comme projet de démarrage" et si vous utilisez un cadre d'entité dans une couche de données, installez le nuget de cadre d'entité dans le projet principal.
Cela se produit également si le projet de démarrage est modifié comme celui qui n'a pas a les chaînes de connexion.
Assurez-vous d'ajouter les chaînes de connexion après la section entityFramework
:
<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>
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-le comme non testé, content 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 le fait 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)
utilisez-vous plus d'un projet sur votre solution?
Parce que si vous êtes, la configuration Web que vous devez vérifier est celle du même projet que le fichier de .edmx
J'ai eu 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:
J'ai fait face au même problème. Il me manquait de mettre une chaîne de connexion dans le projet de démarrage car j'effectue une opération d'accès aux données depuis une autre couche. de même 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.
Ajouter ConnectionString au fichier Web.config du projet MVC
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 qu'il s'agisse d'une conservation 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 se produit dans le projet Web car il n'y a pas de processus automatique pour ajouter des informations aléatoires .config dans le fichier web.config du projet Web.
Le plus simple consiste à copier la chaîne de connexion du fichier de configuration dans la section des connexions du fichier web.config et à ignorer le contenu du fichier de configuration.
Cela pourrait également entraîner un nombre insuffisant de références à la DLL dans le code appelant. Un petit bidouillage 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. Ce fichier faisait référence à la bibliothèque de classe BAL, à son tour référencée par un service WCF.
Depuis que je recevais cette erreur dans le BAL, j'avais essayé la méthode susmentionnée pour copier les détails de configuration à partir du fichier App.config du projet DAL, mais je n'ai pas résolu le problème. En fin de compte, avec le conseil d’un ami, je viens d’ajouter un fichier EDMX factice au projet WCF (avec la connectivité DB correspondante, etc.). une construction propre.
Je l’ai eu en ne définissant pas le projet au 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 la console Nuget Package Manager Console (n'incluez pas les caractères '[' ou ']', c'est pour vous montrer que besoin de changer le texte situé là pour votre nom de projet):
Ça devrait le faire.
Assurez-vous d'avoir placé la chaîne de connexion dans le web.config ROOT du projet de démarrage.
Je sais que je suis un peu en train de dire ce qui est évident ici, mais cela m'est aussi arrivé - même si j'avais déjà la chaîne de connexion dans le fichier Web.Config de mon projet MVC (le fichier .edmx a été placé dans un projet de bibliothèque de classes différent). Je ne comprends pas pourquoi je continue à avoir une exception ....__ En résumé, 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 début. Scénario Explorateur du bas de la solution ... Oui, ces choses-là arrivent aussi aux développeurs expérimentés :)
Il existe deux options - la première que tout le monde a suggérée ici est de s'assurer que la chaîne de connexion est dans le fichier Web.config du projet. Lorsque vous utilisez des chaînes de connexion à partir de paramètres d'application Azure, cela signifie que vous écrasez vos valeurs Web.config par les valeurs Azure.
Si vous exécutez des migrations par programme, une deuxième option est disponible. Elle vous permet d’exécuter des migrations à l’aide d’une chaîne de connexion obtenue de manière dynamique (ou via les paramètres d’application Azure) sans la stocker dans Web.config:
Lorsque vous définissez la configuration 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 prend uniquement un nom de connexion. Si votre chaîne de connexion ne comporte pas de nom de fournisseur et que vous utilisez SQL Server/Azure SQL, utilisez alors "System.Data.SqlClient".
Le meilleur moyen que je viens de trouver pour résoudre ce problème consiste à définir temporairement ce projet (probablement une bibliothèque de classes) sur le projet de démarrage. Cela oblige la console du gestionnaire de packages à utiliser ce projet en tant que 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 habituellement. En règle générale, le projet le plus proche du client (par exemple, l'application MVC) est le fichier web.config ou app.config qui sera utilisé.
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 à votre guise, mais apportez les modifications suivantes 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 la chaîne de connexion dans la classe dérivée de DbConext (dans votre cas, il s'agit de MyEntities), DbContext recherchera automatiquement une chaîne de connexion dans le fichier racine Web.config. Identique au nom de la classe dérivée (dans votre cas, il s'agit de Mes entités).
Ce problème survient lorsque vous utilisez des couches dans votre projet et que le cadre Entity défini ou installé fonctionne dans DataLayer et que vous essayez d’exécuter votre projet.
Donc, pour surmonter ce problème, copiez la chaîne de connexion à partir de la couche contenant le fichier Edmx et collez-la dans le fichier web.config principal.
J'ai eu ce problème lors de l'exécution de MSTest. Je ne pouvais pas le faire fonctionner sans le drapeau "noisolation".
Espérons que cela aide quelqu'un. Cela m'a coûté beaucoup de temps pour comprendre cela. Tout fonctionnait bien depuis l'IDE. Quelque chose de bizarre à propos de Entity Framework dans ce contexte.