La connessione specificata specificata non è stata trovata nella configurazione, non è stata progettata per essere utilizzata con il provider EntityClient o non è valida


170

Ho un oggetto framework un'entità e quando lo aggiungo al mio progetto, connectionstring viene aggiunto app.confignella connectionstringsezione, ma quando voglio crearne uno nuovo entitycontexte utilizzarlo connectionstring, viene visualizzato questo errore



4
Grazie per il link, Craig. Voto per mantenere questa discussione, però, perché il titolo è stato ciò che mi ha aiutato a trovare l'errore MetadataException.
jp2code,

Questo mi è successo quando il file di configurazione non si è aggiornato con una stringa di connessione per qualche strano motivo.
P.Brian.Mackey,

Risposte:


217

Ho il sospetto che il tuo problema derivi dal fatto che hai più di un progetto nella tua soluzione e quello che contiene le cose del tuo framework di entità inclusi i edmxfile NON è il progetto di avvio della soluzione. In questo caso, anche se la stringa di connessione esiste nel app.configprogetto EF , CLR non riesce a trovarla in fase di esecuzione. Ad esempio, se si dispone di un sito Web e di un progetto EF nella soluzione, è necessario copiare la stringa di connessione dai progetti EF app.configa quelli del sito Web web.config. Fondamentalmente, tutti i dati della stringa di connessione dovrebbero esistere nel file di configurazione del progetto da cui i thread .Net sono stati avviati da CLR (ovvero il progetto di avvio). Se questo non è il tuo caso, apri il tuoedmxfile, fare clic con il tasto destro sulla sua superficie, selezionare le proprietà e copiare la stringa di connessione e incollarla nella app.configsezione Stringa di connessione. In questo modo puoi assicurarti di avere quello corretto nella tua configurazione.

EDIT:
Come puoi vedere qui su Documenation su ObjectContext Constructor , il primo parametro è il nome della stringa di connessione che è il codice generato al momento della creazione dell'EDM. Se, in qualche modo, il nome del tuo nome stringa di connessione sembra essere cambiato, tutto ciò che devi fare è fare clic con il pulsante destro del mouse sul modello e selezionare "Aggiorna modello dal database ...", quindi seguire la procedura guidata per aggiornare il tuo confing e designer per riflettere questo modificare.


1
ciao Morteza e grazie per la risposta, ma in precedenza ho copiato la sectin connectiontring in web.config, ma l'errore non è stato risolto, ma quando in entitymodel.designer sostituisce (public EntityContext (): base ("name = EntityContext", EntityContext " )) con la
stringa di

1
@Morteza, hai una soluzione per progetti in cui l'assembly in esecuzione non ha un app.config? Nel mio caso l'eseguibile chiamante è un'app VB6 che chiama il mio assembly (dove si trovano gli oggetti entità) tramite l'interoperabilità COM.
Daishable Dave,

4
così semplice, ma così frustrante. VOTA. Lunga vita allo stackoverflow!
granadaCoder

3
Se stai usando WCF, ricorda di includere la stringa di connessione nel tuo progetto di servizio
Nathan,

1
Grazie Morteza, mi hai fatto risparmiare molto tempo!
Chris,

32

È necessario copiare la stringa di connessione in app.config in web.config o copiare l'intero file nel progetto che visualizza l'output. È una delle condizioni per consumare il quadro.


1
basta aggiungere la stessa stringa di connessione (come nel progetto di accesso ai dati) in web.config (presente nel progetto front-end).
Danese

@ Musikero31 Uso EF e definisco tutte le stringhe di connessione delle entità nel codice. Non ho nulla in una configurazione relativa ad esso.
Keith Beard,

Dopo aver copiato i file DAL in un nuovo progetto, ho ricevuto anche l'errore sopra riportato. Osservando più da vicino i file di configurazione, ho notato che la stringa di connessione è stata sostituita da EF. Sono stato in grado di copiare / incollare manualmente la stringa di connessione corretta nel nuovo progetto e ha funzionato.
Ravi Ram,

9

Mi sono imbattuto in questo problema quando ho provato a inserire la mia logica di database personalizzata in una DLL per essere utilizzata da più progetti nella mia soluzione.

Mentre il file .dll aveva il file app.config corretto, non funzionava. I framework di entità volevano le informazioni di connessione in app.config di .exe. Copiare le informazioni lì ha funzionato bene.

La soluzione di Morteza di incollare la stringa di connessione direttamente in .edmx non ha funzionato per me, poiché non mi lasciava incollare il valore lì dentro, anche se è esattamente quello che volevo essere in grado di fare.


3
Anche se c'era solo un file app.config (e quello era l'unico file di configurazione in quella directory) nella directory del mio exe, non lo avrebbe letto. Ho dovuto rinominare il file myExe.exe.config
Mario

6

Ciao ho avuto questo problema e mi stava facendo impazzire. Comunque alla fine ho capito quale fosse il problema. La prima cosa che devi fare è assicurarti che connectionstringsin app.confige web.configsiano uguali. Quindi è necessario fare doppio clic sul .edmxfile in modo da poter vedere le tabelle. Una volta che fai clic in qualsiasi punto vicino alle tabelle ma non sulle tabelle e vai alle proprietà. Dall'elenco a discesa selezionare ConceptualEntityModele cercare il Nome contenitore entità e ricordarlo bene.

Quindi vai al designer del file edmx e apri i costruttori. (il designer è la sottocartella del file edmx) i costruttori dovrebbero avere due parametri nel parametro BASE

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

Questo è uno di loro. il primo parametro dovrebbe avere il nome del file di progetto in cui si trova il .edmxfile. Il secondo parametro deve avere il nome del nome del contenitore di entità dalle proprietà di cui ho parlato in precedenza. non dimenticare di disporre tutti i costruttori con:base("", "")

Almeno quello era il mio problema e il mio problema era stato risolto in quel modo. Spero che riuscirai a risolvere il tuo in questo modo.


6

Ho avuto una variazione su questo che nessuno sembrava coprire.

Avevo un progetto principale con un paio di modelli e un progetto di test contenente test unitari. Il progetto di test funzionava, ma poi si è fermato con l'errore menzionato nel PO. Non avevo effettuato alcuna ridenominazione o spostamento del file EDMX.

Molti dei consigli menzionati nel confrontare i file .config, ma il mio progetto non ne aveva affatto.

Alla fine, ho copiato il file app.config dal progetto principale nel mio progetto di test e poi ha funzionato. Se questo è il passaggio corretto o presenterà problemi di manutenibilità quando vengono aggiunti altri modelli, non lo so, ma almeno i miei test unitari stanno funzionando correttamente ora.


Da quando l'ho pubblicato, mi sono reso conto che probabilmente sarebbe meglio creare un collegamento al file app.config di un altro progetto. Tuttavia, l'altro approccio funzionerà per risolvere il problema originale quando non esiste alcun file di configurazione.
S. Baggy,

4

Sebbene la risposta di Morteza Manavi risolva questo problema, un'altra soluzione è quella di costruire la stringa di connessione in modo dinamico e passarla nel costruttore per 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());

Ciò elimina la necessità di copiare le informazioni sulla stringa di connessione nell'app.config del progetto di avvio che, almeno nel mio caso, non era desiderabile.


4

Ho dimenticato di aggiungere providerName = "System.Data.EntityClient" come attributo nella stringa di connessione. Ciò ha comportato questo errore così

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

invece di

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

2

Ho appena scoperto che se si crea un'app in IIS da VS2010 a due livelli dalla radice del sito Web, si verificherebbe questo errore. Non sono sicuro del perché accada, avrebbe bisogno di indagare di più. Ad esempio, se l'app si trova in questo percorso: /admin/advertiserl'errore verrebbe visualizzato se non si dispone /admindi directory virtuale nel sito IIS.

Tutto quello che ho fatto è stato creato una admindirectory vuota nel mio .../intepub/wwwrooterrore scomparso.

Scoprirai che non sarai in grado di iniziare il debug fino a quando non eseguirai il passaggio precedente.

Abbiamo avuto questo problema nel nostro team in passato, ci è voluto un po 'di tempo per ricordare, ma è stato esattamente così anche prima.


1

Sto usando una nuova architettura e ho lo stesso problema, ma questo mi aiuta, spero che questo ti aiuterà. Innanzitutto hai lo stesso connection stringsu di te librariesdove puoi accedere a DB come in app.confige web.config dopo che aggiungi semplicemente un costruttore sovraccaricato nel file .edmx (Model.context.cs) che ora hai due costruttore uno è predefinito e l'altro che hai appena aggiunto ( sovraccarico).

        public YourEntityName(string connString)
            : base(connString)
        {
        }

1

Avevo una biblioteca di classe che non voleva nemmeno lavorare con EF. Dopo aver copiato app.config (o solo la sezione connectionstring) dalla mia libreria di classi al progetto exe la connessione ha funzionato bene! Probabilmente il file di configurazione dovrebbe trovarsi nella stessa cartella del progetto exe e quindi non è stato trovato. Quindi fai sempre molta attenzione quando un file di configurazione viene utilizzato in un progetto di libreria di classi!


0

Bene ... questo problema potrebbe essere anche per un motivo molto semplice (stupido) ... Ho copiato un file da un altro progetto e ho dimenticato di cambiare ConnectionString su EntityDataSource ... com'ero all'inizio del progetto ed è successo nella pagina di accesso, ho pensato che fosse qualcosa nella configurazione, ma era solo il nome della stringa di connessione errato (e DefaultContainerName).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.