MetadataException: no se puede cargar el recurso de metadatos especificado

De repente sigo obteniendo una MetadataException al crear una instancia de mi clase ObjectContext generada. La cadena de conexión en App.Config parece correcta, no ha cambiado desde la última vez que funcionó, y he intentado regenerar un nuevo modelo (archivo edmx) de la base de datos subyacente sin cambios.

¿Alguien tiene alguna idea?

Más detalles: no he cambiado ninguna propiedad, no he cambiado el nombre de ningún ensamblaje de salida, no he intentado incrustar el EDMX en el ensamblaje. Me limité a esperar 10 horas después de dejar el trabajo hasta que volví. Y luego ya no funcionaba.

Intenté volver a crear el EDMX. He intentado recrear el proyecto. Incluso intenté recrear la base de datos, desde cero. Sin suerte, en absoluto.

Esto significa que la aplicación no puede cargar el EDMX. Hay varias cosas que pueden causar esto.

  • Es posible que haya cambiado la propiedad MetadataArtifactProcessing del modelo a Copiar al directorio de salida.
  • La cadena de conexión podría estar equivocada. Sé que dices que no lo has cambiado, pero si has cambiado otras cosas (por ejemplo, el nombre de una asamblea), todavía podría estar mal.
  • Es posible que esté utilizando una tarea de comstackción posterior para incrustar el EDMX en el ensamblado, que ya no funciona por algún motivo.

En resumen, no hay suficientes detalles en su pregunta para dar una respuesta precisa, pero espero que estas ideas lo lleven por el buen camino.

Actualización: escribí una publicación de blog con más pasos completos para solucionar problemas .

Este pequeño cambio ayuda con este problema.

Tengo solución con 3 proyectos.

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

cambiar a

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

Puede obtener esta excepción cuando el Edmx está en un proyecto y lo está usando desde otro.

El motivo es Res://*/ es un uri que apunta a recursos en el ensamblaje CURRENT. Si Edm se define en un ensamblaje diferente del código que lo está utilizando, res: // * / no funcionará porque no se puede encontrar el recurso.

En lugar de especificar ‘*’, debe proporcionar el nombre completo del conjunto (incluido el token de clave pública). P.ej:

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

Una mejor forma de construir cadenas de conexión es 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(); } 

Si aún encuentra la excepción, abra el ensamblaje en reflector y verifique los nombres de los archivos .csdl, .ssdl y .msl. Cuando los recursos tienen nombres diferentes a los especificados en el valor de los metadatos, no va a funcionar.

Tuve un error similar. Recreé el proyecto (larga historia) y saqué todo del proyecto anterior. No me había dado cuenta de que mi modelo había estado en un directorio llamado ‘Modelo’ antes, y ahora estaba en un directorio llamado ‘Modelos’. Una vez que cambié la conexión en mi Web.Config a partir de esto:

 
		      	

Y una forma rápida de verificar el nombre del modelo sin Reflector … busque el directorio

… obj / {config output} / edmxResourcesToEmbed

y verifique que los archivos de recursos .csdl, .msl y .ssdl estén allí. Si están en un subdirectorio, el nombre del subdirectorio debe anteponerse al nombre del modelo.

Por ejemplo, mis tres archivos de recursos están en un subdirectorio Datos , por lo que mi cadena de conexión debe ser

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

(frente a metadatos = res: //*/MyModel.csdl | res: //*/MyModel.ssdl | res: //*/MyModel.msl;).

También tuve este problema y fue porque la conexión de mi web.config era ligeramente diferente a la de la app.config del ensamblaje donde se encuentra mi EDMX. No tengo idea de por qué cambió, pero aquí están las dos versiones diferentes.

App.config:

  

Web.config:

  

Lo que lo solucionó fue simplemente copiar la cadena app.config (observe la pequeña diferencia al final – en lugar de ” App=EntityFramework ” que quería ” application name=EntityFramework “) en el web.config y se solucionó el problema. 🙂

Esto me sucedió cuando accidentalmente cambié la Acción de comstackción del archivo edmx (aparece en Propiedades en el IDE) de ‘EntityDeploy’ a ‘Ninguno’. EntityDeploy es lo que llena los metadatos para usted: vea http://msdn.microsoft.com/en-us/library/cc982037.aspx

Acabo de pasar unos felices 30 minutos con esto. Cambié el nombre del objeto de entidades, renombré la entrada en el archivo de configuración, pero hay más … también debes cambiar la referencia al csdl

muy fácil de perder, si cambias el nombre, asegúrate de obtener todo

Pude resolver esto en Visual Studio 2010, VB.net (ASP.NET) 4.0.

Durante el asistente de modelo de entidad, podrá ver la cadena de conexión de la entidad. Desde allí puede copiar y pegar en su cadena de conexión.

Lo único que me faltaba era el “App_Code”. en la cadena de conexiones.

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

Yo tuve el mismo problema. Busqué en mi dll comstackdo con reflector y he visto que el nombre del recurso no era el correcto. Cambié el nombre y se ve bien ahora.

Para mi caso, se soluciona cambiando las propiedades del archivo edmx.

  1. Abra el archivo edmx
  2. Haga clic derecho en cualquier lugar del diseñador de EDMX
  3. elegir propiedades
  4. Propiedad llamada “Procesamiento de artefactos de metadatos” para “Insertar en ensamblaje de salida”

Esto resolvió mi problema. El problema es que cuando el contenedor trata de encontrar los metadatos, no puede encontrarlo. así que simplemente hazlo en el mismo conjunto. esta solución no funcionará si tiene sus archivos edmx en otro ensamblado

Pasé un día entero en este error

si trabajas con la n-tear architecture

o trataste de separate Models generados por EDMX DataAccessLayer a DomainModelLayer

tal vez obtendrás este error

  1. El primer paso de solución de problemas es asegurarse de que la cadena de conexión en webconfig (UILayer) y appconfig (DataAccessLayer) sean los mismos
  2. Segundo, lo cual es muy importante, la connection string

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

    cuál es el problema

de donde en la tierra obtuve Model o lo que sea .csdl en mi cadena de conexión donde están

Aquí yo nuestra solución mira la imagen

enter image description here

espero que la ayudes

La solución definitiva (incluso después de recrear la base de datos en otras dos máquinas, así como el EDMX y otros artículos) fue no utilizar la primera edición de Entity Framework. Tengo ganas de volver a evaluarlo en .NET 4.0.

Después de encontrar nuevamente el mismo problema y buscar una respuesta, finalmente encontré a alguien que tenía el mismo problema. Parece que la cadena de conexión no fue generada correctamente por el asistente de Visual Studio, y el enlace a los recursos de metadatos carecía de una ruta importante.

v1.0 ¿ERROR ?: Imposible cargar el recurso de metadatos especificado. Scripts! = Modelos

Actualización 2013-01-16 : habiendo hecho la transición casi exclusivamente a las prácticas de EF Code First (incluso con bases de datos existentes), este problema ya no es un problema. Para mí, esa fue una solución viable para reducir el desorden del código y la configuración generados automáticamente y boost mi propio control sobre el producto.

Mi problema y solución, los síntomas fueron los mismos “No se pudo cargar el recurso de metadatos especificado” pero la causa raíz fue diferente. Tenía dos proyectos en la solución uno era el modelo de la entidad y el otro la solución. De hecho, borré y recreé el archivo EDMX en EntityModel.

La solución fue que tuve que regresar al proyecto de aplicación web y agregar esta línea al archivo de configuración. El nuevo modelo había cambiado algunos elementos que debían duplicarse en el archivo Web.Config del “otro” proyecto. La configuración anterior ya no era buena.

   

Después de horas buscando en Google e intentando resolver ninguna de las soluciones sugeridas, funcionó. He enumerado varias soluciones aquí. También he notado el que funcionó para mí. (Estaba usando EF versión 6.1.1 y SQL server 2014, pero un DB anterior)

  1. Reconstruir el proyecto e intentar nuevamente.
  2. Cierre y abra VS – No sé cómo funciona esto
  3. asegúrese de que si ha colocado el archivo .EDMX dentro de un directorio, asegúrese de incluir los directorios en ConnectionString. por ejemplo, el mío está dentro de la carpeta DAL. ASÍ se ve así: connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl; (estos son archivos. para verlos puede alternar Mostrar todos los archivos en el explorador de soluciones, en el directorio ~ / obj / ..)

… y muchos más que había intentado [como: revertir la versión de EntityFramework a una versión posterior (no estoy seguro de ello)]


lo que funcionó para mí:

de este artículo aquí , me ayudó a resolver mi problema. Acabo de cambiar mi ProviderManifestToken="2012" a ProviderManifestToken="2008" en el archivo EDMX. Para hacer esto:

Explorador de la solución

  1. Haga clic derecho sobre el archivo .edmx
  2. Abrir con..
  3. Editor XML
  4. Cambiar ProviderManifestToken = “XXXX” con 2008

Espero que eso ayude.

En mi caso, este problema estaba relacionado con el cambio de nombre del archivo edmx de mi modelo … la corrección de la cadena de conexión app.config para los archivos csdl / ssdl / msl solucionó mi problema.

Si está utilizando el diseñador EF 4.0 para generar su csdl / ssdl / msl, estos 3 “archivos” se almacenarán en el archivo edmx principal del modelo. En este caso, la publicación de Waqas es bastante acertada. Es importante entender que “Model_Name” en su ejemplo deberá cambiarse a cualquiera que sea el nombre actual del archivo .edmx de su modelo (sin el .edmx).

Además, si su archivo edmx no está en el nivel raíz de su proyecto, debe preformar Model_Name con la ruta relativa, por ejemplo

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

especificaría que csdl / ssdl / msl xml se almacena en el archivo de modelo ‘WidgetModel.edmx’ que se almacena en una carpeta llamada ‘MyModel’.

Escribí esta clase de ayuda para crear instancias de objetos ObjectContext cuando están definidos en un proyecto diferente al del proyecto que lo usa. Analizo la cadena de conexión en el archivo de configuración y reemplazo ‘*’ por el nombre completo del ensamblado.

No es perfecto porque usa reflexión para construir el objeto, pero es la manera más genérica de hacerlo que pude encontrar.

Espero que ayude a alguien.

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

Para todos los usuarios de SelftrackingEntities , si ha seguido el recorrido de Microsoft y separado la clase de contexto Object en el proyecto de servicio de wcf (al vincular el contexto .tt) para que esta respuesta sea para usted:

parte de las respuestas mostradas en esta publicación que incluye código como:

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

NO FUNCIONARÁ PARA TI !! la razón es que YourObjectContextType.Assembly ahora reside en un Assembley diferente (dentro del ensamblado del proyecto wcf),

Por lo tanto, debe reemplazar YourObjectContextType.Assembly.FullName con ->

 ClassTypeThatResidesInEdmProject.Assembly.FullName 

que te diviertas.

Estaba teniendo problemas con este mismo mensaje de error. Mi problema se resolvió al cerrar y volver a abrir Visual Studio 2010.

Tuve el mismo problema porque cambié el nombre de un ensamblaje.

También tuve que cambiarle el nombre en los atributos AssemblyTitle y AssemblyProduct en Project Properties / AssemblyInfo.cs, y también eliminar y volver a agregar la referencia al archivo edmx.

Entonces funcionó bien.

Al tener el mismo problema recreé edmx desde la base de datos. Resuelve mi problema

La excepción se debe a que el comstackdor apunta a metadatos no existentes, por lo que simplemente copie app.config connectionstring a Web.config ConnectionString

También tenía el mismo problema y solución que Rick, excepto que estaba importando un .edmx existente a un nuevo proyecto, y aunque el espacio de nombres base no importaba, se importó a un subdirectorio diferente, así que también tuve que actualizar la conexión. cadena dentro de Web.Config en tres lugares, para incluir los diferentes nombres de subdirectorio:

Tuve el mismo problema con una solución que contenía proyectos en una Carpeta de soluciones, cuando se movieron a la raíz de la solución (para superar una sospecha de error con el Mvc3AppConverter debido a las ubicaciones del proyecto).

Aunque la solución comstackda después de todas las referencias * del proyecto se volvió a agregar según fuera necesario, el error se produjo cuando se inició el sitio web.

El EDMX está en uno de los proyectos que se movió (el proyecto ‘Datos’), pero, por supuesto, la falta de una referencia al proyecto Datos no causó un error de comstackción, solo un error en tiempo de ejecución.

Simplemente al agregar la referencia faltante al proyecto principal, se resolvió este problema, sin necesidad de editar la conexión.

Espero que esto ayude a alguien más.

Un archivo pobre de app.config o web.config puede hacer esto … Copié la cadena de conexión de app.config a mi web.config en mi UI y terminé ingresando:

      

Simplemente no había hecho referencia a la biblioteca de mi clase que contenía el archivo EDMX.

Si está utilizando edmx desde un proyecto diferente, entonces en la cadena de conexión, cambie …

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

…a…

 metadata=res://*/DataModel.csdl 

Esto me sucede cuando no limpio la solución antes de crear el nuevo diseñador .edmx. Así que no olvides limpiar la solución antes de construir un nuevo diseñador .edmx. Esto me ayuda a omitir muchos más problemas con este. A continuación, proporcione los detalles de navegación provistos en caso de que sea nuevo en Visual Studio.

Click-> Build-> Clean Solution

Luego haga clic en -> Construir -> Reconstruir solución

Espero que esto ayude. Gracias a todos

Mi teoría es que si tienes más de un archivo edmx con el mismo nombre (Model1, por ejemplo), dará esa excepción. Tengo el mismo problema cuando decidí ponerle nombre a todos mis archivos edmx (en diferentes proyectos) como Model1 porque pensé que deberían ser independientes.

Otra causa para esta excepción es cuando incluye una tabla relacionada en un ObjectQuery, pero escribe el nombre de propiedad de navegación incorrecto.

Ejemplo:

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