MetadataException: no se puede cargar el recurso de metadatos especificado

Resuelto J. Steen asked hace 15 años • 47 respuestas

De repente, sigo teniendo problemas para crear instancias de mi clase MetadataExceptiongenerada . ObjectContextLa cadena de conexión en App.Config parece correcta (no ha cambiado desde la última vez que funcionó) e intenté regenerar un nuevo modelo (archivo edmx) desde 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. Simplemente esperé 10 horas desde que salí del trabajo hasta que regresé. Y luego ya no funcionó.

Intenté recrear el EDMX. Intenté recrear el proyecto. Incluso intenté recrear la base de datos desde cero. No hubo suerte en absoluto.

J. Steen avatar Mar 27 '09 18:03 J. Steen
Aceptado

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 un ensamblaje), aún podría estar mal.
  • Es posible que esté utilizando una tarea posterior a la compilación para incrustar el EDMX en el ensamblado, que ya no funciona por algún motivo.

En resumen, su pregunta no contiene suficientes detalles para dar una respuesta precisa, pero esperamos que estas ideas lo lleven por el camino correcto.

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

Craig Stuntz avatar Mar 27 '2009 12:03 Craig Stuntz

Una pequeña enmienda me ayudó con este problema.

Tuve una solución con 3 referencias de proyectos:

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

que cambié a:

connectionString="metadata=res://*/;
MicTech avatar Jul 16 '2009 12:07 MicTech

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

El motivo Res://*/es un uri que apunta a recursos en el ensamblado ACTUAL. Si Edm está definido en un ensamblado diferente al código que lo usa, res://*/ no funcionará porque no se puede encontrar el recurso.

En lugar de especificar '*', debe proporcionar el nombre completo del ensamblado (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 manera 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 ensamblado en reflector y verifique los nombres de sus archivos .csdl, .ssdl y .msl. Cuando los recursos tienen nombres diferentes a los especificados en el valor de los metadatos, no funcionará.

user276695 avatar Feb 19 '2010 05:02 user276695

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 antes en un directorio llamado "Modelo" y ahora estaba en un directorio llamado "Modelos". Una vez que cambié la conexión en mi Web.Config de esto:

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

a esto:

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

Todo funcionó (cambiado Modela Models). Tenga en cuenta que tuve que cambiar estos tres lugares en esta cadena.

Rick Arthur avatar Dec 04 '2009 05:12 Rick Arthur

Y una forma rápida de comprobar el nombre del modelo sin Reflector... busque el directorio.

...obj/{salida de configuración}/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 Data , por lo que mi cadena de conexión tenía que ser

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

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

leqid avatar Nov 13 '2013 16:11 leqid