MetadataException: imansible caricare la risorsa di metadati specificata

Tutto ad un tratto continuo a ricevere MetadataException durante l’istanziazione della mia class ObjectContext generata. La stringa di connessione in App.Config sembra corretta – non è cambiata dall’ultima volta che ha funzionato – e ho provato a rigenerare un nuovo modello (edmx-file) dal database sottostante senza modifiche.

Qualcuno ha qualche idea?

Ulteriori dettagli: Non ho cambiato nessuna proprietà, non ho cambiato il nome di alcun assembly di uscita, non ho provato ad incorporare EDMX nell’assemblaggio. Ho solo aspettato 10 ore per lasciare il lavoro fino al mio ritorno. E poi non funzionava più.

Ho provato a ricreare l’EDMX. Ho provato a ricreare il progetto. Ho persino provato a ricreare il database, da zero. Nessuna fortuna, qualunque cosa.

Ciò significa che l’applicazione non è in grado di caricare EDMX. Ci sono molte cose che possono causare questo.

  • Potrebbe essere stata modificata la proprietà MetadataArtifactProcessing del modello in Copia in Output Directory.
  • La stringa di connessione potrebbe essere sbagliata. So che dici di non averlo cambiato, ma se hai cambiato altre cose (ad esempio il nome di un’assemblea), potrebbe ancora essere sbagliato.
  • È ansible che si stia utilizzando un’attività di post-compilazione per incorporare EDMX nell’assieme, che non funziona più per qualche motivo.

In breve, nella tua domanda non ci sono abbastanza dettagli per dare una risposta accurata, ma spero che queste idee ti portino sulla buona strada.

Aggiornamento: ho scritto un post sul blog con ulteriori passaggi completi per la risoluzione dei problemi .

Questo piccolo cambiamento aiuta con questo problema.

Ho una soluzione con 3 progetti.

 connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl; 

cambiare a

 connectionString="metadata=res://*/; 

È ansible ottenere questa eccezione quando Edmx è in un progetto e lo si sta utilizzando da un altro.

Il motivo è Res://*/ è un uri che punta alle risorse nell’assembly CURRENT. Se Edm è definito in un assembly diverso dal codice che lo sta usando, res: // * / non funzionerà perché la risorsa non può essere trovata.

Invece di specificare “*”, è necessario fornire il nome completo dell’assembly (incluso il token della chiave pubblica). Per esempio:

 res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://... 

Un modo migliore per build stringhe di connessione è con EntityConnectionStringBuilder:

 public static string GetSqlCeConnectionString(string fileName) { var csBuilder = new EntityConnectionStringBuilder(); csBuilder.Provider = "System.Data.SqlServerCe.3.5"; csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName); csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", typeof(YourObjectContextType).Assembly.FullName); return csBuilder.ToString(); } public static string GetSqlConnectionString(string serverName, string databaseName) { SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder(); providerCs.DataSource = serverName; providerCs.InitialCatalog = databaseName; providerCs.IntegratedSecurity = true; var csBuilder = new EntityConnectionStringBuilder(); csBuilder.Provider = "System.Data.SqlClient"; csBuilder.ProviderConnectionString = providerCs.ToString(); csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", typeof(YourObjectContextType).Assembly.FullName); return csBuilder.ToString(); } 

Se si verifica ancora l’eccezione, aprire l’assieme in reflector e controllare i nomi file per i file .csdl, .ssdl e .msl. Quando le risorse hanno nomi diversi da quelli specificati nel valore dei metadati, non funzionerà.

Ho avuto un errore simile. Ho ricreato il progetto (lunga storia) e ho tirato tutto dal vecchio progetto. Non mi ero reso conto che il mio modello si trovava in una directory chiamata ‘Model’ prima e ora si trovava in una directory chiamata ‘Models’. Una volta ho cambiato la connessione nel mio Web.Config da questo:

 
		      	

E un modo rapido per controllare il nome del modello senza Reflector …. cerca la directory

… obj / {output di configurazione} / edmxResourcesToEmbed

e controlla che i file delle risorse .csdl, .msl e .ssdl siano presenti. Se si trovano in una sottodirectory, il nome della sottodirectory deve essere anteposto al nome del modello.

Ad esempio, i miei tre file di risorse si trovano in una sottodirectory Data , quindi la mia stringa di connessione doveva essere

metadata = res: // * / Data .MyModel.csdl | res: // * / Data .MyModel.ssdl | res: // * / Data .MyModel.msl;

(rispetto a metadata = res: //*/MyModel.csdl | res: //*/MyModel.ssdl | res: //*/MyModel.msl;).

Ho anche avuto questo problema ed è stato perché il connectiontring nel mio web.config era leggermente diverso da quello nell’app.config dell’assembly in cui si trova il mio EDMX. Non ho idea del perché sia ​​cambiato, ma qui ci sono le due versioni differenti.

App.config:

  

web.config:

  

Quello che ha risolto è stato semplicemente copiare la stringa app.config (notare la piccola differenza alla fine – invece di ” App=EntityFramework ” voleva ” application name=EntityFramework “) nel web.config e il problema è stato risolto. 🙂

Questo è successo a me quando ho accidentalmente cambiato l’azione Build del file edmx (appare in Proprietà nell’IDE) da ‘EntityDeploy’ a ‘None’. EntityDeploy è ciò che popola i metadati per te: vedi http://msdn.microsoft.com/en-us/library/cc982037.aspx

Ho appena trascorso 30 minuti felici con questo. Ho rinominato l’object quadro, rinominato la voce nel file di configurazione, ma c’è di più … devi anche cambiare il riferimento a csdl

molto facile da perdere – se stai rinominando, assicurati di ottenere tutto ….

Sono stato in grado di risolvere questo problema in Visual Studio 2010, VB.net (ASP.NET) 4.0.

Durante la procedura guidata del modello quadro, sarà ansible visualizzare la stringa di connessione dell’entity framework. Da lì è ansible copiare e incollare nella stringa di connessione.

L’unica cosa che mi mancava era “App_Code”. nella stringa di connessioni.

 entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl" 

Ho avuto lo stesso problema. Ho esaminato la mia dll complied con reflector e ho visto che il nome della risorsa non era giusto. Ho ribattezzato e ora sembra a posto.

Per il mio caso, è risolto modificando le proprietà del file edmx.

  1. Apri il file edmx
  2. Fare clic con il pulsante destro del mouse su qualsiasi punto del designer EDMX
  3. scegli proprietà
  4. aggiorna la proprietà chiamata “Elaborazione artefatti metadati” a “Incorpora nell’assieme di output”

questo ha risolto il problema per me. Il problema è che quando il contenitore cerca di trovare i metadati, non riesce a trovarlo. quindi fallo semplicemente nello stesso assemblaggio. questa soluzione non funzionerà se si hanno i file edmx in un altro assieme

Ho passato un’intera giornata a questo errore

se stai lavorando con n-tear architecture

oppure hai provato a separate Models generati da EDMX da DataAccessLayer a DomainModelLayer

forse otterrai questo errore

  1. Il primo passo per la risoluzione dei problemi è assicurarsi che la stringa di connessione in webconfig (UILayer) e appconfig (DataAccessLayer) siano uguali
  2. Secondo che è molto importante la connection string

     connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provid..... 

    qual è il problema

da dove sulla Terra ho ottenuto Model o qualunque .csdl nella mia stringa di connessione dove sono

qui io la nostra soluzione guarda l’immagine

inserisci la descrizione dell'immagine qui

spero che ti aiuti

La soluzione definitiva (anche dopo aver ricreato il database su due altre macchine, oltre all’EDMX e altri articoli vari) era di non utilizzare la prima edizione di Entity Framework. Non vedo l’ora di valutarlo nuovamente in .NET 4.0.

Dopo aver incontrato di nuovo lo stesso problema e aver cercato dappertutto una risposta, ho finalmente trovato qualcuno che aveva avuto lo stesso problema. Sembra che la stringa di connessione non sia stata generata correttamente dalla procedura guidata di Visual Studio e che il collegamento alle risorse di metadati mancasse di un percorso importante.

v1.0 BUG ?: Imansible caricare la risorsa di metadati specificata. Script! = Modelli

Aggiornamento 2013-01-16 : Dopo aver passato quasi esclusivamente all’utilizzo del codice EF Prime pratiche (anche con database esistenti) questo problema non è più un problema. Per me, questa era una soluzione praticabile per ridurre il disordine dal codice e dalla configurazione auto-generati e aumentare il mio controllo sul prodotto.

Il mio problema e la mia soluzione, i sintomi erano gli stessi “Imansible caricare la risorsa di metadati specificata” ma la causa principale era diversa. Ho avuto 2 progetti in soluzione uno era il EntityModel e l’altra la soluzione. Ho effettivamente cancellato e ricreato il file EDMX in EntityModel.

La soluzione era che dovevo tornare al progetto Web Application e aggiungere questa riga nel file di configurazione. Il nuovo modello aveva modificato alcuni elementi che dovevano essere duplicati nel file Web.Config “altro” del progetto. La vecchia configurazione non era più valida.

   

Dopo ore di googling e cercando di risolvere nessuna delle soluzioni suggerite ha funzionato. Ho elencato diverse soluzioni qui. Ho anche notato quello che ha funzionato per me. (Stavo usando EF versione 6.1.1 e SQL server 2014 – ma un vecchio DB)

  1. Ricostruisci il progetto e riprova.
  2. Chiudi e apri VS – Non so come funziona
  3. assicurati di aver inserito il file .EDMX in una directory, assicurati di includere le directory in ConnectionString. per esempio il mio è all’interno della cartella DAL. SO assomiglia a questo: connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl; (questi sono file per vederli è ansible triggersre Mostra tutti i file in solution explorer, nella directory ~ / obj / ..)

… e molti altri che ho provato [come: ripristinare la versione di EntityFramework in una versione successiva (non ne sono sicuro)]


cosa ha funzionato per me:

da questo articolo qui , mi ha aiutato a risolvere il mio problema. Ho appena cambiato ProviderManifestToken="2012" in ProviderManifestToken="2008" nel file EDMX. Per fare questo:

Esploratore di soluzioni

  1. Fare clic con il pulsante destro del mouse sul file .edmx
  2. Aperta con..
  3. Editor XML
  4. Cambia ProviderManifestToken = “XXXX” con il 2008

Spero che aiuti.

Nel mio caso, questo problema era legato alla ridenominazione del file edmx del mio modello … correggendo la stringa di connessione app.config per i file csdl / ssdl / msl risolto il problema.

Se stai usando il designer EF 4.0 per generare il tuo csdl / ssdl / msl, questi 3 “file” saranno effettivamente memorizzati nel file edmx principale del modello. In questo caso, il post di Waqas è praticamente in linea. È importante capire che “Model_Name” nel suo esempio dovrà essere modificato in qualunque sia il nome corrente del file .edmx del tuo modello (senza .edmx).

Inoltre, se il tuo file edmx non si trova al livello di root del tuo progetto, devi prefigurare Model_Name con il percorso relativo, ad es.

 res://*/MyModel.WidgetModel.csdl|res://*/MyModel.WidgetModel.ssdl|res://*/MyModel.WidgetModel.msl 

specificarebbe csdl / ssdl / msl xml è memorizzato nel file di modello ‘WidgetModel.edmx’ che è memorizzato in una cartella denominata ‘MyModel’.

Ho scritto questa class helper per creare istanze di oggetti ObjectContext quando sono definiti in un progetto diverso rispetto al progetto che lo utilizza. Analizzo la stringa di connessione nel file di configurazione e sostituisco ‘*’ con il nome completo dell’assembly.

Non è perfetto perché usa il riflesso per build l’object, ma è il modo più generico di farlo che ho trovato.

Spero che aiuti qualcuno.

 public static class EntityHelper where T : ObjectContext { public static T CreateInstance() { // get the connection string from config file string connectionString = ConfigurationManager.ConnectionStrings[typeof(T).Name].ConnectionString; // parse the connection string var csBuilder = new EntityConnectionStringBuilder(connectionString); // replace * by the full name of the containing assembly csBuilder.Metadata = csBuilder.Metadata.Replace( "res://*/", string.Format("res://{0}/", typeof(T).Assembly.FullName)); // return the object return Activator.CreateInstance(typeof(T), csBuilder.ToString()) as T; } } 

Per tutti voi utenti di SelftrackingEntities , se avete seguito Microsoft Walk-through e separato la class di contesto Object nel progetto del servizio wcf (collegando al contesto .tt), questa risposta è per voi:

parte delle risposte mostrate in questo post che include codice simile a:

 ... = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", typeof(YourObjectContextType).Assembly.FullName); 

NON LAVERA PER TE !! il motivo è che YourObjectContextType.Assembly ora risiede in un Assembley diverso (all’interno dell’assembly del progetto wcf),

Quindi dovresti sostituire YourObjectContextType.Assembly.FullName con ->

 ClassTypeThatResidesInEdmProject.Assembly.FullName 

divertiti.

Stavo avendo problemi con questo stesso messaggio di errore. Il mio problema è stato risolto chiudendo e riaprendo Visual Studio 2010.

Ho avuto lo stesso problema perché ho ribattezzato un assembly.

Ho dovuto anche rinominarlo negli attributi AssemblyTitle e AssemblyProduct in Proprietà progetto / AssemblyInfo.cs e anche eliminare e aggiungere il riferimento al file edmx.

Quindi ha funzionato bene.

Con lo stesso problema ho ricreato edmx dal Database. Risolve il mio problema.

L’eccezione è dovuta al fatto che il compilatore punta a metadati non esistenti, quindi copia semplicemente app.config connectionstring a Web.config ConnectionString

Avevo anche lo stesso problema e soluzione di Rick, tranne che stavo importando un .edmx esistente in un nuovo progetto, e mentre lo spazio dei nomi di base non importava, veniva importato in una sottodirectory diversa, quindi dovevo anche aggiornare la connessione stringa all’interno di Web.Config in tre punti, per includere la diversa denominazione della sottodirectory:

Ho avuto lo stesso problema con una soluzione che conteneva i progetti in una cartella della soluzione, quando venivano spostati nella soluzione root (per superare un bug sospetto con Mvc3AppConverter a causa delle posizioni del progetto).

Sebbene la soluzione sia stata compilata dopo che tutti i riferimenti * al progetto sono stati aggiunti nuovamente, se necessario, l’errore è stato generato quando il sito Web è stato triggersto.

L’EDMX si trova in uno dei progetti che sono stati spostati (il progetto “Dati”), ma ovviamente la mancanza di un riferimento al progetto Data non ha causato un errore di compilazione, ma solo un errore di run-time.

Semplicemente aggiungendo il riferimento mancante al progetto principale risolto questo problema, non è necessario modificare la connessione.

Spero che questo aiuti qualcun’altro.

Un povero file app.config o web.config può farlo .. Ho copiato la stringa di connessione app.config sul mio web.config nell’interfaccia utente e ho finito per inserire:

      

Semplicemente non avevo fatto riferimento alla mia libreria di classi che conteneva il file EDMX.

Se si sta utilizzando edmx da un progetto diverso, nella stringa di connessione, cambiare …

 metadata=res://*/Data.DataModel.csdl 

…a…

 metadata=res://*/DataModel.csdl 

Questo mi succede quando non pulisco la soluzione prima di build un nuovo designer .edmx. Quindi, non dimenticare di pulire la soluzione prima di creare un nuovo designer .edmx. Questo mi aiuta a saltare molti più problemi con questo. Di seguito i dettagli di navigazione forniti in caso di novità nello studio visivo.

Click-> Build-> Clean Solution

Quindi fare clic su -> Crea-> Ricrea soluzione

Spero che questo ti aiuti. Grazie a tutti

La mia teoria è che se si ha più di un file edmx con lo stesso nome (Modello1 per esempio), darà quell’eccezione. Ho lo stesso problema quando ho deciso di nominare tutti i miei file edmx (seduti in diversi progetti) come Model1 perché pensavo che dovessero essere indipendenti.

Un’altra causa di questa eccezione è quando si include una tabella correlata in un object ObjectQuery, ma si digita il nome della proprietà di navigazione errato.

Esempio:

 var query = (from x in myDbObjectContext.Table1.Include("FKTableSpelledWrong") select x);