Nessuna stringa di connessione denominata "MyEntities" non è stata trovata nel file di configurazione dell'applicazione


246

Sto usando Entity Framework e ASP.NET MVC 4 per creare un'applicazione

La mia soluzione è divisa in due progetti;

  • Una libreria di classi che include il file del mio modello di dati (.edmx) e alcune interfacce personalizzate
  • Il progetto MVC "container" che fa riferimento alla libreria di classi sopra

Il mio problema è che quando provo ad usare il DbContext " MyEntites " ottengo il seguente errore:

Nessuna stringa di connessione denominata "MyEntities" non è stata trovata nel file di configurazione dell'applicazione.

Immagino che il problema abbia a che fare con il fatto che la stringa di connessione risiede nell'app.config della libreria di classi piuttosto che nel progetto MVC.

Qualcuno ha qualche suggerimento?


15
Non esattamente lo stesso contesto del tuo (migrazioni automatiche con EF6) ma ho avuto lo stesso problema con un messaggio di errore simile quando ho creato un ramo figlio su TFS e ho iniziato a lavorarci su. Contrassegnare il progetto mvc come progetto di avvio risolto questo. uscita 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).
Oggetto meccanico

Risposte:


309

Prova a copiare la stringa di connessioni nel file .config nel progetto MVC.


63
Funziona perfettamente, ma mi piacerebbe sapere perché il progetto referenziato non sta usando il proprio file di configurazione per recuperare la stringa di connessione.
Null Head,

7
@Alexander Vecchia domanda ma sì, vorrei anche sapere il perché.
Kehlan Krumme,

22
@Alexander, il framework carica e utilizza i file di configurazione per l'assembly in esecuzione. In questo caso, è il progetto web. Le librerie di classi generalmente non hanno i propri file di configurazione.
Kiprainey,

24
I comandi Enable-Migration quando eseguiti nel contesto di NuGet COnsole, esaminano il file di configurazione di Startup Projects, non necessariamente il progetto in cui penseresti che sarebbe inserito. Basta impostare il progetto con l'app.config che si desidera essere l'avvio progetto. Facoltativamente, archivia le stringhe di connessione in un file di configurazione, quindi fai riferimento a esse in altri progetti <connectionString configSource = "../ ProjectDir / SharedConnections.config" />
Ryan Mann,

3
Ho ricevuto questo messaggio di errore esatto, ma il mio file .config - nel progetto giusto - ha effettivamente elencato la stringa di connessione corretta. Tuttavia, stavo usando le trasformazioni e ovviamente la stringa di connessione non faceva riferimento nel file .config trasformato. Quindi è qualcosa da cercare, se stai usando trasformazioni di file di configurazione.
Morten Nørgaard,

143

Hai ragione, questo accade perché la libreria di classi (dove il file .edmx) non è il tuo progetto di avvio / principale.

Dovrai copiare la stringa di connessione nel file di configurazione principale del progetto.

Nel caso in cui il tuo progetto di avvio / principale non abbia un file di configurazione (come se fosse nel mio caso Applicazione console) basta aggiungerne uno (Progetto di avvio - Aggiungi nuovo elemento -> File di configurazione dell'applicazione).

Informazioni più pertinenti sono disponibili qui: MetadataException: impossibile caricare la risorsa di metadati specificata


8
La risposta chiave a questo è che la libreria di classi (dove si trova il file .edmx) non è il tuo progetto STARTUP. Mi sono reso conto che il mio progetto di avvio non era impostato sul progetto in cui era presente il mio web.config. Era un'app console con un app.config diverso. Quindi se stai aggiungendo applicazioni console alla tua soluzione web, assicurati che il tuo progetto web sia il progetto di avvio quando esegui update-database!
Karl,

1
Ho scaricato il mio progetto principale per qualche motivo e dopo averlo ricaricato ho riscontrato questo errore nel tentativo di aggiungere migrazioni. Rendere il principale progetto di avvio del progetto risolto nuovamente il problema. Grazie @Oren
Azadrum,

2
Il mio progetto di avvio era stato modificato per errore. Questo è il bit chiave. La tua risposta mi ha davvero aiutato!
Fabio Milheiro,

98

assicurati di rendere il tuo progetto (con DbContext) come avvio

sul progetto fare clic con il tasto destro e selezionare

O

Aggiungi al progetto impostato come avvio la stringa di connessione in app.config (o web.config)

O

Chiama il comando in questo modo

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'

Quindi riprovare


2
In realtà è il progetto che contiene la stringa di connessione che deve essere impostata come progetto di avvio, e di solito non è il progetto in cui si trova il tuo file DbContext
Raymond Wang

1
... quindi, oltre ad assicurarsi che Package Mgr abbia come target il livello giusto, lo stesso layer deve essere Set as Startup Project- come per lo screenshot mostrato sopra. (anche se premi F5, non saresti in grado di avviare la libreria di classi)
bkwdesign

3
Questo mi ha salvato la vita. Anche se in Gestione pacchetti avevo il Progetto predefinito impostato sul progetto in cui era impostato il contesto, non ha ancora la precedenza.
garfbradaz,

1
"Ma ha funzionato ieri! Lo stesso comando esatto !" => QUESTO!
Simon_Weaver,

1
Il modo più semplice =)
Alexandr

29

Potresti semplicemente passare la stringa di connessione EntityFrameworke andare avanti con la tua vita:

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...
}

e mi ha reso felice anche perché non sono riuscito a trovare una soluzione al motivo per cui il mio progetto di avvio ha improvvisamente smesso di trovare il file di configurazione. La mia app.config e <appname> .exe.config erano presenti nel mio cestino del progetto di avvio e tuttavia EntityFramework non riusciva a trovare la stringa di connessione che avevo usato da sempre. Recentemente ho rimosso una serie di progetti inutilizzati dalla soluzione e mi chiedo se ciò abbia avuto a che fare con esso. Ho rimosso un progetto Web dalla soluzione. Mi chiedevo se i miei altri progetti si basassero sul web.config o qualcosa di insolito del genere.
GrayDwarf,

La configurazione del progetto in esecuzione viene utilizzata da tutti gli altri progetti figlio.
Serj Sagan,

1
ma come impostare il nome del provider?
FizxMike,

9

Come si suppone, ha a che fare con la stringa di connessione che si trova in app.config della libreria di classi.

Copia la voce dalla classe app.config nel contenitore app.configo nel web.configfile


8

Se hai più progetti in soluzione, imposta il progetto upUp come iniziato dove hai la tua verità App.config.


7

copia la stringa di connessione app.configo il web.configfile nel progetto impostato su "Imposta come StartUpprogetto" e, nel caso in cui si utilizzi il framework di entità nel progetto di livello dati, installare il nuget del framework di entità nel progetto principale.


4

Succede anche se il progetto di avvio viene modificato in uno che non ha le stringhe di connessione .

  1. Soluzione clic destro - proprietà clic
  2. In Proprietà comuni, selezionare il progetto di avvio
  3. Nel riquadro destro selezionare il progetto con le stringhe di connessione (nella maggior parte dei casi, saranno i progetti MVC - il progetto che avvia la soluzione)

Sì funziona. Ho creato una libreria di classi per EF per comunicare con il DB e ho riscontrato lo stesso problema.
Satinder Sidhu,

4
  1. Aggiungi un file App.Config
  2. Imposta il progetto come progetto di avvio.
  3. Assicurati di aggiungere le stringhe di connessione dopo la entityFrameworksezione:

    <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

Sì, è sciocco. È possibile evitare di copiare la stringa di connessione utilizzando un generatore di connessione. Codice VB.Net (usato in produzione, ma leggermente modificato qui, quindi trattalo come non testato, felice di aiutarti con qualsiasi problema), dove ho una variabile serverName, una variabile databaseName, li passo in un metodo e faccio generare la connessione per me:

    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

stai usando più di un progetto per la tua soluzione?

Perché se lo sei, la configurazione web che devi controllare è quella sullo stesso progetto del file de .edmx


Sì, questo è il caso. Il progetto che contiene la stringa di connessione è una libreria di classi che include solo un file App.config. Il progetto MVC non sembra controllare questo.
jjc99,

durante lo sviluppo controllerà solo l'app.config sul suo progetto, è necessario aggiungere lì
Diego,

Grazie per la tua risposta. Ho provato a copiare la stringa di connessione dal progetto contenente il file edmx e posizionandola nel file web.config di root nel mio progetto MVC. Sfortunatamente, non riesce ancora a trovare la stringa di connessione. Devo modificare la stringa di connessione in qualche modo?
jjc99,

è il contrario. In dev time hai bisogno della stringa con su app.cofnig sul Progetto che ha il file .edmx. Se ce l'hai forse il nome è sbagliato. Il nome della stringa di connessione deve essere lo stesso nome della proprietà "entity entityr name" del tuo file .edmx
Diego,

1

Aggiungere ConnectionString al file Web.config del progetto MVC


1

Ho avuto questo problema quando utilizzo più progetti, il progetto di avvio con web.config e app.config per il progetto EntityFramework.

per evitare questo problema devi:

  1. È necessaria la stringa di connessione nel file * .config avviato.
  2. È necessario aver installato la DLL EntityFramework nei riferimenti

1

Ho affrontato lo stesso problema. Mi mancava di mettere la stringa di connessione al progetto di avvio mentre eseguo un'operazione di accesso ai dati da un altro livello. anche se non hai app.config nel tuo progetto di avvio, aggiungi il file app.config e quindi aggiungi una stringa di connessione a quel file di configurazione.


1
Grazie, ho avuto un problema con il caricamento del mio progetto e ha perso il "Progetto di avvio". La tua risposta mi ha ricordato di assicurarmi che il progetto con il file di contesto e app.config fosse l'avvio.
Mastro,

1

Ho ottenuto questo non avendo il progetto impostato come avvio, come indicato da un'altra risposta. Il mio contributo a questo: quando si esegue Add-Migrations e Update-Database, specificare il progetto di avvio come parte del comando nella console di Nuget Package Manager (non includere i caratteri '[' o ']', è solo per mostrarti che tu devi cambiare il testo che si trova lì con il nome del tuo progetto):

  1. Enable-Migrazioni
  2. Add-Migrations -StartupProject [il nome del tuo progetto che contiene la classe di contesto dei dati]
  3. Update-Database -StartupProject [stesso nome progetto come sopra]

Questo dovrebbe farlo.


In questo modo è possibile includere i comandi nelle proprie procedure e non è necessario modificare costantemente il progetto di avvio dal valore predefinito.
JakeJ

1

È perché la classe di contesto viene ereditata da DbContext. Immagino che il tuo ctor sia così:

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

name=... dovrebbe essere modificato con il nome della tua connessioneString


0

La stringa di connessione generata dal progetto contenente il file .edmx genera la stringa di connessione, questo sembrerebbe un blocco dai tipi di file app.config che sono stati copiati nella directory di output e referenziati dall'eseguibile per memorizzare le informazioni di configurazione del runtime.

Ciò interrompe il progetto Web poiché non esiste un processo automatico per aggiungere informazioni casuali .config nel file web.config per il progetto Web.

Il più semplice è copiare la stringa di connessione dal file di configurazione nella sezione connessioni del file web.config e ignorare il contenuto del file di configurazione.


0

Il modo migliore che ho appena trovato per risolvere questo problema è impostare temporaneamente quel progetto (molto probabilmente una libreria di classi) sul progetto di avvio. Ciò impone alla console del gestore pacchetti di utilizzare quel progetto come sorgente di configurazione. parte del motivo per cui è impostato in questo modo è a causa del modello top down che di solito seguono i file econfig. La regola empirica è che il progetto più vicino al client (ad esempio l'applicazione MVC) è il web.config o app.config che verrà utilizzato.


0

Assicurati di aver inserito la stringa di connessione nel web.config ROOT del progetto di avvio.

So che sto affermando un po 'l'ovvio qui, ma è successo anche a me - anche se avevo già AVUTO la stringa di connessione nel Web.Config del mio progetto MVC (il file .edmx era collocato in un diverso progetto di libreria di classi) e non potevo capisco perché continuo a ricevere un'eccezione ... Per farla breve, ho copiato la stringa di connessione in Views \ Web.Config per errore, in una strana combinazione di stanchezza e non-scrolling-to-the-bottom-of -il scenario-soluzione-esploratore. Sì, queste cose accadono anche agli sviluppatori veterani :)


0

Questo problema si verifica quando si utilizzano Layer nel progetto e si definisce o si installa il frame Entity in DataLayer e si tenta di eseguire il progetto

Quindi, per ovviare a questo problema, copia la stringa di connessione dal livello in cui è presente il file Edmx e incolla la stringa di connessione in web.config principale.


0

Aggiungere una stringa di connessione nel file web.config principale del progetto MVC 'container' che fa riferimento alla libreria di classi come segue:

 <connectionStrings>

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

  </connectionStrings>

Se non si desidera utilizzare "MyEntities" come nome della connessione, modificarlo come desiderato, ma apportare la seguente modifica nella classe DbContext di MyEntities:

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

Il motivo di questo errore è: se non specificheremo il nome della stringa di connessione o la stringa di connessione nella classe derivata di DbConext (nel tuo caso è MyEntities), DbContext cercherà automaticamente una stringa di connessione nel file root web.config, il cui nome è come il nome della classe derivata (nel tuo caso è Le mie entità).


0

Ho avuto questo problema durante l'esecuzione di MSTest. Non sono riuscito a farlo funzionare senza la bandiera "noisolation".

Spero che questo aiuti qualcuno. Mi è costato molto tempo per capirlo. Tutto andava bene dall'IDE. Qualcosa di strano in Entity Framework in questo contesto.


0

Migrazioni regolari

Esistono due opzioni: la prima suggerita da tutti qui è quella di garantire che la stringa di connessione si trovi nel file Web.config del progetto. Quando si lavora con stringhe di connessione dalle impostazioni dell'applicazione di Azure, ciò significa sovrascrivere i valori Web.config con i valori di Azure.

Migrazioni di Azure o automatiche (programmatiche)

È disponibile una seconda opzione se si eseguono migrazioni a livello di codice, che consente di eseguire migrazioni usando una stringa di connessione ottenuta in modo dinamico (o tramite le impostazioni dell'applicazione di Azure) senza archiviarla in Web.config:

Quando si imposta TargetDatabase della configurazione , utilizzare il costruttore DbConnectionInfo che accetta una stringa di connessione e un nome del provider anziché il costruttore che accetta solo un nome di connessione. Se la stringa di connessione non ha un nome provider e si utilizza SQL Server / Azure SQL, utilizzare "System.Data.SqlClient"


0

Ciò potrebbe anche comportare riferimenti a dll insufficienti a cui si fa riferimento nel codice chiamante. Un piccolo trucco goffo potrebbe salvarti la giornata.

Stavo seguendo l'approccio DB First e avevo creato il file EDMX nel progetto della libreria di classe DAL, e questo stava facendo riferimento alla libreria di classe BAL, che a sua volta era referenziata da un servizio WCF.

Da quando ho riscontrato questo errore nel BAL, ho provato il metodo sopra menzionato per copiare i dettagli di configurazione dall'App.config del progetto DAL, ma non ho risolto. Alla fine con la punta di un amico ho appena aggiunto un file EDMX fittizio al progetto WCF (con relativa connettività DB ecc.), Quindi ha importato tutto il necessario, quindi ho semplicemente eliminato il file EDMX e mi sono liberato del problema con una costruzione pulita.


0

C'è un commento sulla risposta principale di @RyanMann che suggerisce:

Memorizza le tue stringhe di connessione in un file di configurazione, quindi fai riferimento ad esse in altri progetti <connectionString configSource="../ProjectDir/SharedConnections.config" />

Questo è un suggerimento fantastico!

Funziona anche per condividere le stringhe di connessione tra i file App.config e Web.config!

Chiunque desideri seguire questo suggerimento, dovrebbe andare avanti a questa risposta SO . Ha una guida passo-passo davvero eccezionale sulla condivisione delle stringhe di connessione tra più progetti in una soluzione.

L'unica avvertenza è che configSourcedeve esistere nella stessa directory o sottodirectory. Il link sopra spiega come usare "Aggiungi come link" per aggirare questo.


0

Ho riscontrato questo errore durante il tentativo di utilizzare EF all'interno di un plug-in AutoCAD. I plugin CAD ottengono la stringa di connessione dal file acad.exe.config. Aggiungi la stringa di connessione come menzionato sopra al file di configurazione di acad e funziona.

Il merito va a Norman.Yuan da ADN.Network.


0

Se si utilizza un modello MVVM, provare a copiare le stringhe di connessione in tutte le parti del progetto.

Ad esempio, se la soluzione contiene due progetti, il progetto libreria di classi e il progetto wpf, è necessario copiare le stringhe di connessione del progetto back-end (porject classe libreria) e posizionarne una copia nel file App.config del progetto wpf.

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

Spero sia utile per te :)


-2

Aggiungi Connectoinstrnig nel file web.config

<ConnectionStiring> <add name="dbName" Connectionstring=" include provider name too"  ></ConnectionStiring>
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.