Pregunta MetadataException: no se puede cargar el recurso de metadatos especificado


De repente, sigo recibiendo un MetadataException en instanciar mi generada ObjectContext clase. 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.


607
2018-03-27 11:15


origen


Respuestas:


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 compilació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.

Actualizar: He escrito una publicación de blog con pasos más completos para la solución de problemas.


770
2018-03-27 12:02



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://*/;

322
2017-07-16 12:12



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

La razón 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.


106
2018-02-19 05:41



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:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl 

a esto:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl

Todo funcionó (cambió Model a Models) Tenga en cuenta que tuve que cambiar estos tres lugares en esta cadena.


55
2017-12-04 05:55



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, entonces mi cadena de conexión tenía que ser

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

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


24
2017-11-13 16:57



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:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SMCSModel.csdl|res://*/Model.SMCSModel.ssdl|res://*/Model.SMCSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Web.config:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SCMSModel.csdl|res://*/Model.SCMSModel.ssdl|res://*/Model.SCMSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

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


14
2017-11-27 09:02



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


12
2017-12-17 10:11



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 estás renombrando, asegúrate de obtener todo ....


6
2018-01-12 16:37



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"

5
2017-08-31 19:31



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


5
2017-10-12 09:42