MetadataException quando si utilizza Entity Framework Entity Connection

Questo codice:

using (EntityConnection conn = new EntityConnection("name=ELSCommonEntities")) { conn.Open(); } 

Mi dà il seguente errore:

 Test method ELS.Service.Business.IntegrationTest.Base.ServiceBaseIntegrationTest.StartLoggingTestMethod threw exception: System.Data.MetadataException: Unable to load the specified metadata resource.. 

Con la seguente traccia dello stack:

 System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.LoadResources(String assemblyName, String resourceName, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.CreateResourceLoader(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) System.Data.Metadata.Edm.MetadataArtifactLoader.Create(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) System.Data.EntityClient.EntityConnection.SplitPaths(String paths) System.Data.EntityClient.EntityConnection.GetMetadataWorkspace(Boolean initializeAllCollections) System.Data.EntityClient.EntityConnection.InitializeMetadata(DbConnection newConnection, DbConnection originalConnection, Boolean closeOriginalConnectionOnFailure) System.Data.EntityClient.EntityConnection.Open() ELS.Service.Business.Base.ServiceBase.StartLogging(String userWindowsLogon) in C:\C-TOM\ELS-RELEASE1\ELS.Service.Business\Base\ServiceBase.cs: line 98 ELS.Service.Business.IntegrationTest.Base.ServiceBaseIntegrationTest.StartLoggingTestMethod() in C:\C-TOM\ELS-RELEASE1\ELS.Service.Business.IntegrationTest\Base\ServiceBaseIntegrationTest.cs: line 65 

Tuttavia, questo codice che utilizza la stessa stringa di connessione:

 using (ELSCommonEntities db = new ELSCommonEntities()) { var res = from c in db.Logging select c; int i = res.Count(); } 

Non dà un errore.

La stringa di connessione è:

  

Ho anche aperto la dll nel reflector e il metadata sembra ok.

Trovato il problema

La stringa di metadati standard ha il seguente aspetto:

 metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl 

E questo funziona bene nella maggior parte dei casi. Tuttavia, in alcuni (incluso il mio) Entity Framework si confonde e non sa quale dll cercare. Pertanto, modifica la stringa dei metadati in:

 metadata=res://nameOfDll/Model.csdl|res://nameOfDll/Model.ssdl|res://nameOfDll/Model.msl 

E funzionerà. È stato questo collegamento che mi ha portato sulla strada giusta:

http://itstu.blogspot.com/2008/07/to-load-specified-metadata-resource.html

Anche se ho avuto il problema di oposite, non ha funzionato in unit test, ma ha funzionato in servizio.

Ho avuto lo stesso messaggio di errore e il problema era anche la parte dei metadati della stringa di connessione, ma ho dovuto scavare un po ‘più a fondo per risolverlo e volevo condividere questo piccolo nugget:

La stringa di metadati è composta da tre sezioni che assomigliano a questa:

 res:// (assembly)/ (model name).(ext) 

Dove ext è “csdl”, “ssdl” e “msl”.

Per la maggior parte delle persone, l’ assembly può probabilmente essere “*”, il che sembra indicare che tutti gli assembly caricati verranno cercati (non ho fatto un gran numero di test su questo). Questa parte non era un problema per me, quindi non posso commentare se hai bisogno del nome dell’assembly o del nome del file (cioè, con o senza “.dll”), anche se ho visto entrambi suggerito.

La parte del nome del modello dovrebbe essere il nome e lo spazio dei nomi del file .edmx, relativo all’assembly. Quindi se hai un assembly My.DataAccess e crei DataModels.edmx in una cartella Models , il suo nome completo è My.DataAccess.Models.DataModels . In questo caso, avresti “Models.DataModels. (Ext)” nei tuoi metadati.

Se dovessi spostare o rinominare il tuo file .edmx, dovrai aggiornare manualmente la stringa dei metadati (nella mia esperienza), e ricordando di cambiare lo spazio dei nomi relativo risparmierai qualche mal di testa.

Ci sono diverse catture possibili. Penso che l’errore più comune sia in questa parte della stringa di connessione:

res: //xxx/yyy.csdl | res: //xxx/yyy.ssdl | res: //xxx/yyy.msl;

Questa non è magia. Una volta capito cosa significa, otterrai la stringa di connessione giusta.

Prima la parte xxx . Questo è nient’altro che un nome di assembly in cui hai definito il tuo contesto EF clas. Di solito sarebbe qualcosa come MyProject.Data . Il valore predefinito è * che rappresenta tutti gli assiemi caricati. È sempre meglio specificare un nome particolare dell’assembly.

Ora la parte yyy . Questo è un nome di risorsa nell’assembly xxx . Di solito è qualcosa di simile a un percorso relativo al tuo file .edmx con punti anziché barre. Ad esempio Modelli / CatalogoModelli.Catalog Il modo più semplice per ottenere la stringa corretta per l’applicazione è creare l’assembly xxx . Quindi apri il file di assembly assembly in un editor di testo (preferisco il visualizzatore predefinito di Total Commander) e cerca “.csdl”. Di solito non ci sarà più di 1 occorrenza di quella stringa.

La tua stringa di connessione EF finale potrebbe essere simile a questa:

res: //MyProject.Data/Models.Catalog.DataContext.csdl | res: //MyProject.Data/Models.Catalog.DataContext.ssdl | res: //MyProject.Data/Models.Catalog.DataContext.msl;

Come ha risposto Shiraz Bhaiji, il metadata = res: ///Model.csdl | res: ///Model.ssdl | res: //*/Model.msl era il caso. Tuttavia ho ancora avuto problemi con la costruzione della stringa corretta in base alla localizzazione, agli spazi dei nomi e al nome del mio modello. La soluzione molto semplice era quella di rinominare il file .edmx in Visual Studio (dopo averlo rinominato e tornare al nome originale), che ha triggersto l’aggiornamento automatico della stringa nel mio Web.config

Ho avuto lo stesso problema con tre progetti in una soluzione e tutti i suggerimenti non hanno funzionato fino a quando non ho creato un riferimento nel file di riferimento del progetto del sito web al progetto in cui si trova il file edmx.

Ho spostato il mio Database First DataModel in un progetto diverso a metà dello sviluppo. Povera pianificazione (o mancanza di) da parte mia.

Inizialmente ho avuto una soluzione con un progetto. Quindi ho aggiunto un altro progetto alla soluzione e ricreato il mio Database First DataModel da Data Server SQL Server.

Per risolvere il problema: MetadataException quando si utilizza Entity Framework Entity Connection . Ho copiato il mio ConnectionString dal nuovo Project Web.Config al progetto originale Web.Config . Tuttavia, ciò si è verificato dopo aver aggiornato tutti i riferimenti nel progetto originale al nuovo progetto DataModel .

Potrebbe essere solo un errore di stringa di connessione, che è risolto dal processo precedente, ma se stai usando la DLL in più progetti assicurandoti che la stringa di connessione sia nominata correttamente, l’errore sarà sicuramente risolto.

Ho avuto questo problema durante lo spostamento del mio primo database .edmx da un progetto a un altro.

Ho semplicemente fatto quanto segue:

  1. Eliminate le stringhe di connessione in app.config o web.config
  2. Eliminato il ‘Model.edmx’
  3. Ri-aggiunto il modello al progetto.