web-dev-qa-db-fra.com

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

J'ai un objet cadre à une entité et lorsque je l'ajoute à mon projet, le connectionstring est ajouté à app.config dans la section connectionstring, mais lorsque je veux créer un nouveau entitycontext et utiliser ce connectionstring, cette erreur apparaît

166
user421413

Je soupçonne que votre problème provient du fait que votre solution contient plus d'un projet et que celui qui contient votre structure, y compris les fichiers edmx, 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 projet EF app.config, 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 à partir du app.config Du projet EF vers le web.config De votre site Web. En principe, 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é initiés par CLR (c’est-à-dire votre projet de démarrage). Si ce n'est pas votre cas, ouvrez simplement votre fichier edmx, faites un clic droit sur sa surface, sélectionnez les propriétés, copiez la chaîne de connexion et collez-la dans votre section app.config Chaîne de connexion. De cette façon, vous pouvez vous assurer que vous avez le bon fichier dans votre configuration.

EDIT:
Comme vous pouvez le voir ici sur ( Documentation sur le constructeur ObjectContext , le premier paramètre est le nom de la chaîne de connexion qui est code généré au moment de la création de votre GED. Si, d'une manière ou d'une autre, le nom de votre chaîne de connexion change, il vous suffit de cliquer avec le bouton droit de votre souris sur votre modèle et de sélectionner "Mettre à jour le modèle à partir de la base de données ..." puis suivez les instructions de l'assistant. pour mettre à jour votre concepteur et confing afin de refléter ce changement.

216
Morteza Manavi

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

31
Musikero31

J'ai rencontré ce problème lorsque j'ai essayé de placer ma logique de base de données personnalisée dans un fichier .dll afin qu'elle soit utilisée par plusieurs projets de ma solution.

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

La solution de Morteza consistant à coller la chaîne de connexion directement dans le fichier .edmx ne fonctionnait pas pour moi, car elle ne me permettait pas de coller la valeur, bien que ce soit précisément ce que je voulais pouvoir faire.

9
Walt Stoneburner

J'avais une variation à 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 arrêté avec l'erreur mentionnée dans l'OP. Je n'avais pas renommé ni déplacé le fichier EDMX.

La plupart des conseils mentionnaient la comparaison de 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 si des problèmes de maintenabilité se poseront lorsque de nouveaux modèles seront ajoutés, mais au moins mes tests unitaires fonctionnent à nouveau correctement.

6
S. Baggy

Bonjour, j'ai eu ce problème et ça me rendait dingue. Enfin bref, j'ai compris quel était le problème. La première chose que vous devez faire est de vous assurer que connectionstrings dans app.config Et web.config Sont les mêmes. Ensuite, vous devez double-cliquer sur le fichier .edmx Pour voir les tables. Une fois que vous 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 ConceptualEntityModel, recherchez le nom du conteneur d'entité et conservez-le en mémoire.

Ensuite, allez 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 fichier .edmx. Le deuxième paramètre doit avoir le nom du conteneur d'entité parmi les propriétés que j'ai mentionnées précédemment. n'oubliez pas de disposer tous les constructeurs avec le: base("", "")

Au moins c'était mon problème et mon problème a été résolu comme ça. J'espère que tu parviendras à résoudre le tien comme ça.

6
MaltaCoders

Bien que réponse de Morteza Manavi résolve ce problème, une autre solution consiste à créer la chaîne de connexion de manière dynamique 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 évite 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.

4
Nick Spreitzer

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

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

au lieu de

<add name="connectionName" connectionString="metadata=res://*/..." />
4
Gertjan

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

Tout ce que j'ai fait, c'est créer un répertoire admin vide dans mon .../intepub/wwwroot erreur a disparu.

Vous constaterez que vous ne pourrez pas commencer le débogage avant d'avoir effectué l'étape ci-dessus.

Nous avions eu ce problème dans notre équipe par le passé, il nous a fallu un certain temps pour nous en souvenir, mais c’est exactement comme nous l’avons réglé auparavant.

2
Jovica Zaric

J'utilise l'architecture suivante et j'ai le même problème, mais celui-ci m'aide. J'espère que cela vous aidera. D'abord vous avez le même connection string sur vous libraries où vous pouvez accéder à la base de données comme dans app.config et web.config après cela, vous ajoutez simplement un constructeur surchargé dans le fichier .edmx (Model.context.cs). Vous disposez maintenant de deux constructeurs, l’un par défaut et l’autre que vous venez d’ajouter (surchargé).

        public YourEntityName(string connString)
            : base(connString)
        {
        }
1
Hafiz Asad

J'avais une bibliothèque de classe qui ne voulait pas non plus travailler avec EF. Après avoir copié le fichier app.config (ou simplement la section connectionstring) de la bibliothèque de ma classe au 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 vigilant lorsqu'un fichier de configuration est utilisé dans un projet de bibliothèque de classes!

1
Vincent