Question MetadataException: impossible de charger la ressource de métadonnées spécifiée


Tout à coup, je continue à obtenir un MetadataException sur l'instanciation de mon généré ObjectContext classe. La chaîne de connexion dans App.Config semble correcte - n'a pas changé depuis la dernière fois qu'elle a fonctionné - et j'ai essayé de régénérer un nouveau modèle (fichier edmx) à partir de la base de données sous-jacente sans changement.

Quelqu'un a des idées?

Plus de détails: Je n'ai pas changé de propriétés, je n'ai pas changé le nom des assemblages de sortie, je n'ai pas essayé d'intégrer l'EDMX dans l'assemblage. J'ai simplement attendu 10 heures de quitter le travail jusqu'à mon retour. Et puis ça ne fonctionnait plus.

J'ai essayé de recréer l'EDMX. J'ai essayé de recréer le projet. J'ai même essayé de recréer la base de données, à partir de zéro. Pas de chance, quoi que ce soit.


607
2018-03-27 11:15


origine


Réponses:


Cela signifie que l'application est incapable de charger l'EDMX. Il y a plusieurs choses qui peuvent causer cela.

  • Vous avez peut-être modifié la propriété MetadataArtifactProcessing du modèle en Copier dans le répertoire de sortie.
  • La chaîne de connexion peut être incorrecte. Je sais que vous dites que vous ne l'avez pas changé, mais si vous avez changé d'autres choses (disons, le nom d'une assemblée), cela pourrait encore être faux.
  • Vous pouvez utiliser une tâche de post-compilation pour intégrer l'EDMX dans l'assembly, qui ne fonctionne plus pour une raison quelconque.

En bref, il n'y a pas vraiment assez de détails dans votre question pour donner une réponse précise, mais j'espère que ces idées devraient vous mettre sur la bonne voie.

Mettre à jour: j'ai écris un article de blog avec des étapes plus complètes pour le dépannage.


770
2018-03-27 12:02



Ce petit changement aide à résoudre ce problème.

J'ai Solution avec 3 projet.

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

changer pour

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

322
2017-07-16 12:12



Vous pouvez obtenir cette exception lorsque l'Edmx est dans un projet et que vous l'utilisez depuis un autre.

La raison est Res://*/ est un uri qui pointe vers des ressources dans l'assemblée ACTUELLE. Si Edm est défini dans un assembly différent du code qui l'utilise, res: // * / ne fonctionnera pas car la ressource est introuvable.

Au lieu de spécifier '*', vous devez fournir le nom complet de l'assembly à la place (y compris le jeton de clé publique). Par exemple:

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

Une meilleure façon de construire des chaînes de connexion est avec 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 vous rencontrez toujours l'exception, ouvrez l'assembly dans le réflecteur et vérifiez les noms de fichier pour vos fichiers .csdl, .ssdl et .msl. Lorsque les ressources ont des noms différents de ceux spécifiés dans la valeur des métadonnées, cela ne fonctionnera pas.


106
2018-02-19 05:41



J'ai eu une erreur similaire. J'avais recréé le projet (longue histoire), et tout tiré de l'ancien projet. Je n'avais pas réalisé que mon modèle se trouvait auparavant dans un répertoire appelé 'Model' et se trouvait maintenant dans un répertoire appelé 'Models'. Une fois que j'ai changé la connexion dans mon Web.Config à partir de ceci:

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

pour ça:

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

Tout a fonctionné (changé Model à Models). Notez que j'ai dû changer ces trois endroits dans cette chaîne.


55
2017-12-04 05:55



Et un moyen rapide de vérifier le nom du modèle sans réflecteur .... recherchez le répertoire

... obj / {sortie de configuration} / edmxResourcesToEmbed

et vérifiez que les fichiers de ressources .csdl, .msl et .ssdl sont présents. S'ils sont dans un sous-répertoire, le nom du sous-répertoire doit être ajouté au nom du modèle.

Par exemple, mes trois fichiers de ressources sont dans un sous-répertoire Les données, donc ma chaîne de connexion devait être

metadata = res: // * /Les données.MonModel.csdl | res: // * /Les données.MonModel.ssdl | res: // * /Les données.MonModel.msl;

(par rapport à metadata = res: //*/MyModel.csdl | res: //*/MyModel.ssdl | res: //*/MonModel.msl;).


24
2017-11-13 16:57



J'ai aussi eu ce problème et c'était parce que la chaîne de connexion dans mon web.config était légèrement différente de celle de l'app.config de l'assembly où se trouve mon EDMX. Aucune idée pourquoi cela a changé, mais voici les deux versions différentes.

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" />

Ce qui a été corrigé c'était simplement de copier la chaîne app.config (remarquez la petite différence à la fin - au lieu de "App=EntityFramework"ça voulait"application name=EntityFramework") dans le web.config et le problème a été résolu. :)


14
2017-11-27 09:02



Cela m'est arrivé lorsque j'ai basculé accidentellement l'action de construction du fichier edmx (apparaît sous Propriétés dans l'EDI) de 'EntityDeploy' à 'None'. EntityDeploy est ce qui remplit les métadonnées pour vous: voir http://msdn.microsoft.com/en-us/library/cc982037.aspx


12
2017-12-17 10:11