La connexion nommée spécifiée est soit introuvable dans la configuration, non destinée à être utilisée avec le fournisseur EntityClient, soit non valide

170

J'ai un objet de cadre à une entité et lorsque je l'ajoute à mon projet, le connectionstring est ajouté app.configdans la connectionstringsection, mais lorsque je veux en créer un nouveau entitycontextet l'utiliser connectionstring, cette erreur apparaît

user421413
la source
4
Merci pour le lien, Craig. Je vote pour conserver ce fil, car c'est le titre qui m'a aidé à trouver l'erreur MetadataException.
jp2code
Cela m'est arrivé lorsque le fichier de configuration ne s'est pas mis à jour avec une chaîne de connexion pour une raison étrange.
P.Brian.Mackey

Réponses:

217

Je soupçonne que votre problème vient du fait que vous avez plus d'un projet dans votre solution et que celui qui contient votre structure d'entité, y compris les edmxfichiers, n'est PAS le projet de démarrage de la solution. Dans ce cas, même si la chaîne de connexion existe dans le app.configprojet EF , CLR ne peut toujours pas la trouver au moment de l'exécution. Par exemple, si vous avez un site Web et un projet EF dans votre solution, vous devez copier la chaîne de connexion du projet EF app.configvers votre site Web web.config. Fondamentalement, toutes les données de chaîne de connexion doivent exister dans le fichier de configuration du projet à partir duquel les threads .Net ont été lancés par CLR (c'est-à-dire votre projet de démarrage). Si ce n'est pas votre cas, ouvrez simplement votreedmxfichier, faites un clic droit sur sa surface, sélectionnez les propriétés et copiez la chaîne de connexion et collez-la dans votre app.configsection Chaîne de connexion. De cette façon, vous pouvez vous assurer que vous avez le bon dans votre configuration.

EDIT:
Comme vous pouvez le voir ici sur Documentation sur ObjectContext Constructor , le premier paramètre est le nom de la chaîne de connexion qui est le code généré au moment où vous créez votre EDM. Si, d'une manière ou d'une autre, le nom de votre chaîne de connexion change, tout ce que vous avez à faire est de faire un clic droit sur votre modèle et de sélectionner «Mettre à jour le modèle à partir de la base de données ...», puis suivez l'assistant pour mettre à jour votre configuration et votre concepteur pour refléter cela changement.

Morteza Manavi
la source
1
salut Morteza et merci pour votre réponse, mais j'ai précédemment copié la section de chaîne de connexion dans web.config, mais l'erreur n'est pas résolue, mais lorsque dans entitymodel.designer replace (public EntityContext (): base ("name = EntityContext", EntityContext " )) avec la chaîne de connexion cela a fonctionné, tout idae
user421413
1
@Morteza, avez-vous une solution pour les projets dans lesquels l'assembly en cours d'exécution n'a pas d'app.config? Dans mon cas, l'exécutable appelant est une application VB6 qui appelle mon assembly (où se trouvent les objets d'entité) via COM Interop.
Perishable Dave
4
si simple, mais si frustrant. Up VOTE. Vive le stackoverflow!
granadaCoder
3
Si vous utilisez WCF, n'oubliez pas d'inclure la chaîne de connexion dans votre projet de service
Nathan
1
Merci Morteza, m'a fait gagner beaucoup de temps!
Chris
32

Vous devez copier la chaîne de connexion dans app.config dans votre web.config ou copier le fichier entier dans le projet qui affiche la sortie. C'est l'une des conditions pour consommer le cadre.

Musikero31
la source
1
ajoutez simplement la même chaîne de connexion (comme dans le projet d'accès aux données) dans votre web.config (trouvé dans le projet frontal).
danois
@ Musikero31 J'utilise EF et je définis toutes les chaînes de connexion d'entité dans le code. Je n'ai rien dans une configuration à ce sujet.
Keith Beard
Après avoir copié des fichiers DAL dans un nouveau projet, j'ai également reçu l'erreur ci-dessus. En regardant de plus près les fichiers de configuration, j'ai remarqué que la chaîne de connexion a été remplacée par EF. J'ai pu copier / coller manuellement la chaîne de connexion correcte dans le nouveau projet et cela a fonctionné.
Ravi Ram
9

J'ai rencontré ce problème lorsque j'ai essayé de placer ma logique de base de données personnalisée dans un .dll à utiliser par plusieurs projets dans ma solution.

Bien que le .dll contienne le fichier app.config correct, cela ne fonctionne pas. Les frameworks d'entité voulaient les informations de connexion dans le fichier app.config du .exe. Copier les informations là-bas a très bien fonctionné.

La solution de Morteza consistant à coller la chaîne de connexion directement dans le .edmx ne fonctionnait pas pour moi, car elle ne me permettait pas d'y coller la valeur - même si c'est précisément ce que je voulais pouvoir faire.

Walt Stoneburner
la source
3
Même s'il n'y avait qu'un app.config (et c'était le seul fichier de configuration dans ce répertoire) dans le répertoire de mon exe, il ne le lirait pas. J'ai dû renommer le fichier myExe.exe.config
Mario
6

Salut, j'ai eu ce problème et cela me rendait fou. Quoi qu'il en soit, j'ai finalement compris quel était le problème. La première chose que vous devez faire est de vous assurer que le connectionstringsin app.configet web.configsont les mêmes. Ensuite, vous devez double-cliquer sur le .edmxfichier pour voir les tableaux. Une fois que vous êtes, cliquez n'importe où près des tables mais pas sur les tables et allez dans les propriétés. Dans la liste déroulante, sélectionnez ConceptualEntityModelet recherchez le nom du conteneur d'entité et souvenez-vous bien.

Accédez ensuite au concepteur du fichier edmx et ouvrez les constructeurs. (le concepteur est le sous-dossier du fichier edmx) les constructeurs doivent avoir deux paramètres dans le paramètre BASE

public DBEntities() : base("name=DBEntities", "DBEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

C'est l'un d'eux. le premier paramètre doit avoir le nom du fichier de projet dans lequel se trouve le .edmxfichier. Le deuxième paramètre doit avoir le nom du nom du conteneur d'entité parmi les propriétés dont j'ai parlé plus tôt. n'oubliez pas d'agencer tous les constructeurs avec:base("", "")

Au moins c'était mon problème et mon problème a été résolu comme ça. J'espère que vous réussirez à résoudre le vôtre comme ça.

MalteCodeurs
la source
6

J'avais une variante à ce sujet que personne ne semblait couvrir.

J'avais un projet principal avec quelques modèles et un projet de test contenant des tests unitaires. Le projet de test fonctionnait, mais s'est ensuite arrêté avec l'erreur mentionnée dans l'OP. Je n'avais pas fait de changement de nom ou de déplacement du fichier EDMX.

Beaucoup de conseils mentionnés comparaient les fichiers .config, mais mon projet n'en avait pas du tout.

En fin de compte, j'ai copié le fichier app.config du projet principal dans mon projet de test, puis cela a fonctionné. Je ne sais pas si c'est la bonne étape ou présentera des problèmes de maintenabilité lorsque des modèles supplémentaires sont ajoutés, mais au moins mes tests unitaires fonctionnent à nouveau correctement maintenant.

S. Baggy
la source
Depuis que j'ai publié ceci, j'ai réalisé qu'il serait probablement préférable de créer un lien vers le fichier app.config d'un autre projet. Mais toujours, l'autre approche fonctionnera pour résoudre le problème d'origine lorsqu'il n'y a pas du tout de fichier de configuration.
S. Baggy
4

Bien que la réponse de Morteza Manavi résout ce problème, une autre solution consiste à créer dynamiquement la chaîne de connexion et à la transmettre au constructeur de votre ObjectContext:

public static string CreateConnectionString()
{
    var assemblyPath = Assembly.GetExecutingAssembly().Location;
    string assemblyLocation = Path.GetDirectoryName(assemblyPath);
    string dbPath = Path.Combine(assemblyLocation, "YourDatabase.sdf");
    var sqlBuilder = new SqlConnectionStringBuilder { DataSource = dbPath };

    var entityBuilder = new EntityConnectionStringBuilder
    {
        ProviderConnectionString = sqlBuilder.ConnectionString,
        Provider = "System.Data.SqlServerCe.3.5",
        Metadata = @"res://*/YourModel.csdl|
                 res://*/YourModel.ssdl|
                 res://*/YourModel.msl"
    };

    return entityBuilder.ToString();
}

// Snip...

var entityContext = new YourObjectContext(CreateConnectionString());

Cela élimine le besoin de copier les informations de la chaîne de connexion dans le fichier app.config de votre projet de démarrage, ce qui, du moins dans mon cas, n'était pas souhaitable.

Nick Spreitzer
la source
4

J'ai oublié d'ajouter providerName = "System.Data.EntityClient" comme attribut dans la chaîne de connexion. Cela a entraîné cette erreur, donc

<add name="connectionName" connectionString="metadata=res://*/..." providerName="System.Data.EntityClient" />

au lieu de

<add name="connectionName" connectionString="metadata=res://*/..." />
Gertjan
la source
2

Je viens de constater que si une application est créée dans IIS à partir de VS2010 à deux niveaux à partir de la racine du site Web, cette erreur se produirait. Je ne sais pas pourquoi cela se produit, aurait besoin d'enquêter davantage. Par exemple, si votre application se trouve dans ce chemin: /admin/advertiserl'erreur apparaîtrait si vous n'avez pas /adminde répertoire virtuel dans votre site IIS.

Tout ce que j'ai fait est de créer un adminrépertoire vide dans mon .../intepub/wwwrooterreur a disparu.

Vous constaterez que vous ne pourrez pas démarrer le débogage tant que vous n'aurez pas effectué l'étape ci-dessus.

Nous avons eu ce problème dans notre équipe dans le passé, il a fallu un certain temps pour s'en souvenir, mais c'était exactement comme ça que nous l'avons résolu avant aussi.

Jovica Zaric
la source
1

J'utilise l'architecture n'tier et j'ai le même problème, mais celui-ci m'aide. J'espère que cela vous aidera. Tout d'abord, vous avez la même chose connection stringsur vous librariesoù vous pouvez accéder à la base de données comme dans app.configet web.config après cela, vous ajoutez simplement un constructeur surchargé dans le fichier .edmx (Model.context.cs) que maintenant vous avez deux constructeur, l'un est par défaut et l'autre que vous venez d'ajouter ( surchargé).

        public YourEntityName(string connString)
            : base(connString)
        {
        }
Muhammad Asad
la source
1

J'avais une bibliothèque de classes qui ne voulait pas non plus travailler avec EF. Après avoir copié le app.config (ou juste la section connectionstring) de ma bibliothèque de classes vers le projet exe, la connexion a bien fonctionné! Le fichier de configuration devrait probablement se trouver dans le même dossier que le projet exe et n'a donc pas été trouvé. Soyez donc toujours très prudent lorsqu'un fichier de configuration est utilisé dans un projet de bibliothèque de classes!

Vincent
la source
0

Eh bien ... ce problème pourrait être aussi pour une raison très simple (stupide) ... J'ai copié un fichier d'un autre projet et j'ai oublié de changer la ConnectionString sur l'EntityDataSource ... comme j'étais au début du projet et c'est arrivé dans la page de connexion, je pensais que c'était quelque chose sur la configuration, mais c'était juste le mauvais nom de chaîne de connexion (et DefaultContainerName).

Gabriel G
la source