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

tout d'un coup je continue d'obtenir un MetadataException en instanciant ma classe générée ObjectContext . La chaîne de connexion dans l'Application.Config semble correct - n'a pas changé depuis la dernière fois qu'il 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 une idée?

plus de détails: je n'ai pas changé de propriétés, Je n'ai pas changé le nom d'un assemblage de sortie, je n'ai pas essayé intégrer L'EDMX dans l'assemblage. J'ai juste attendu 10 heures entre mon départ du travail et mon retour. Et puis, il 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, que ce soit.

617
demandé sur J. Steen 2009-03-27 14:15:08

30 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 changé la propriété MetadataArtifactProcessing du model pour copier dans le répertoire de sortie.
  • la chaîne de connexion pourrait être erronée. Je sais que vous dites que vous ne l'avez pas changé, mais si vous avez changé d'autres choses (par exemple, le nom d'un assemblage), il pourrait être faux.
  • vous pourriez utiliser une tâche de post-compilation pour intégrer L'EDMX dans l'assemblée, 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 espérons que ces idées devraient vous mettre sur la bonne voie.

mise à jour: j'ai écrit un billet de blog avec des étapes plus complètes pour le dépannage .

778
répondu Craig Stuntz 2018-01-16 13:48:38

ce petit changement aide avec ce problème.

j'ai la Solution avec 3 Projet.

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

changer à

connectionString="metadata=res://*/;
327
répondu MicTech 2016-06-08 08:30:15

Vous pouvez obtenir cette exception lorsque l'Edmx est dans un projet, et vous l'utiliser à partir d'un autre.

la raison est Res://*/ est une uri qui pointe vers les ressources de l'Assemblée actuelle. Si l'Edm est défini dans un assemblage différent du code qui l'utilise, res://*/ ne va pas fonctionner parce que la ressource ne peut pas être trouvée.

au lieu de spécifier"*", vous devez fournir le nom complet de l'assemblée à la place (y compris 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 Entityconnection StringBuilder:

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'ensemble dans reflector et vérifiez les noms de fichiers pour votre .csdl, .lsed et .msl fichiers. Lorsque les ressources ont des noms différents de ceux spécifiés dans la valeur des métadonnées, cela ne va pas fonctionner.

108
répondu user276695 2010-02-19 05:41:42

j'ai eu une erreur similaire. J'avais recréé le projet (longue histoire), et tiré tout sur de l'ancien projet. Je n'avais pas réalisé que mon modèle avait été dans un répertoire appelé 'Modèle' avant, et était maintenant dans un répertoire appelé "Modèles". Une fois que j'ai changé la connexion dans mon Web.Config à partir de ceci:

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

à ceci:

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

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

58
répondu Rick Arthur 2016-05-26 17:22:07

Et un moyen rapide de vérifier le nom du modèle sans Réflecteur.... chercher dans l'annuaire

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

et vérifiez que le .csdl, .msl, et .lsed fichiers de ressources sont là. Si ils sont dans un sous-répertoire, le nom du sous-répertoire doit être ajouté au début du nom du modèle.

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

metadata=res://*/ Données .Monmodèle.csdl|res://*/ Données .Monmodèle.lsed|res://*/ Données .Monmodèle.msl;

(par opposition à des métadonnées=res://*/Monmodèle.csdl|res://*/Monmodèle.lsed|res://*/Monmodèle.msl;).

24
répondu leqid 2013-11-13 16:57:43

j'ai aussi eu ce problème et c'était parce que la chaîne de connexion dans ma toile.la configuration était légèrement différente de celle de l'application.config de l'assemblée où se trouve mon EDMX. Aucune idée de pourquoi il 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 fixé il était simplement la copie de l'application.chaîne de configuration (notez la petite différence à la fin au lieu de " App=EntityFramework "il voulait" application name=EntityFramework ") dans le web.config et le problème a été résolu. :)

14
répondu Ghlouw 2012-11-27 09:02:33

cela m'est arrivé quand j'ai accidentellement changé l'action de compilation du fichier edmx (apparaît sous Propriétés dans L'IDE) de 'EntityDeploy' à 'None'. EntityDeploy est ce qui popule les métadonnées pour vous: voir http://msdn.microsoft.com/en-us/library/cc982037.aspx

12
répondu hgcummings 2009-12-17 10:11:06

je viens de passer une bonne demi-heure avec ça. J'avais renommé l'objet entities, renommé l'entrée dans le fichier de configuration, mais il y a plus ... vous devez aussi changer la référence à la csdl

très facile à manquer - si vous renommez, assurez-vous d'obtenir tout ....

7
répondu TobyEvans 2010-01-12 16:37:10

J'ai pu résoudre ce problème dans Visual Studio 2010, VB.net (ASP.NET) 4.0.

pendant l'Assistant entity model, vous pourrez voir la chaîne de connexion entity. De là, vous pouvez copier et coller dans votre chaîne de connexion.

La seule chose qui me manquait était le "App_Code."dans les connexions de la chaîne.

entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"
5
répondu Internet Engineer 2011-05-24 09:24:38

j'ai eu le même problème. J'ai regardé dans ma dll conforme avec réflecteur et ai vu que le nom de la ressource n'était pas bon. J'ai renommé et il semble bien maintenant.

5
répondu Pitming 2015-04-09 14:50:38

Pour mon cas, il est résolu en changeant les propriétés de fichier edmx.

  1. ouvrir le fichier edmx
  2. clic droit sur n'importe quel lieu de l'EDMX designer
  3. choisir des propriétés
  4. mise à jour de la Propriété appelée "Métadonnées Artefact de Traitement" à "Intégrer à la Sortie de l'Assemblée"

cela a résolu le problème pour moi. Le problème est, quand le conteneur essayer de trouver le méta de données, il ne peux pas le trouver. alors faites-le simplement dans la même assemblée. cette solution ne fonctionnera pas si vous avez vos fichiers edmx dans un autre assemblage

5
répondu user464507 2015-07-29 09:55:52

j'ai passé une journée entière sur cette erreur

si vous travaillez avec n-tear architecture

ou vous avez essayé de separate Models généré par EDMX formulaire DataAccessLayer à DomainModelLayer

peut-être que vous obtiendrez cette erreur

  1. la première étape de dépannage consiste à s'assurer que la chaîne de connexion dans webconfig (UILayer) et appconfig (DataAccessLayer) est la même
  2. Deuxièmement, ce qui est très important. connection string

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

    qui est le problème

d'où j'ai eu Model ou Je ne sais quoi .csdl dans ma chaîne de connexion où sont-ils

me voici notre solution regardez la photo

enter image description here

l'espoir de vous aider à

5
répondu Basheer AL-MOMANI 2016-08-21 16:15:03

la solution ultime (même après avoir recréé la base de données sur deux autres machines, ainsi que L'EDMX et d'autres sundries) était de ne pas utiliser la première édition de Entity Framework. J'ai hâte de l'évaluer à nouveau dans .NET 4.0.

après avoir rencontré le même problème à nouveau et avoir cherché partout une réponse, j'ai finalement trouvé quelqu'un qui avait eu le même problème. Il semble que la chaîne de connexion n'était pas correctement généré par L'assistant de Visual Studio, et le lien vers les ressources de métadonnées manquait un chemin important.

v1.0 BUG?: Impossible de charger la ressource de métadonnées spécifiée. Les Scripts != Modèles

mise à jour 2013-01-16 : après être passé presque exclusivement à l'utilisation des premières pratiques du code EF (même avec les bases de données existantes) ce problème n'est plus un problème. Pour moi, c'était une solution viable à réduire le fouillis généré automatiquement par le code et la configuration et augmenter mon propre contrôle sur le produit.

4
répondu J. Steen 2013-01-16 07:40:06

mon problème et ma solution, les symptômes étaient les mêmes "incapable de charger la ressource de métadonnées spécifiée" mais la cause fondamentale était différente. J'ai eu 2 projets en solution un était L'EntityModel et l'autre la solution. J'ai en fait supprimé et recréé le fichier EDMX dans L'EntityModel.

la solution était que je devais retourner au projet D'Application Web et ajouter cette ligne dans le fichier de configuration. Le nouveau modèle avait changé quelques éléments qui devaient être dupliqué dans le Web de l ' "autre" projet.Fichier de configuration. L'ancienne configuration n'était plus bonne.

     <add name="MyEntities"
     connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;
                    provider=System.Data.SqlClient;
                    provider connection string=&quot;
                    data source=Q\DEV15;initial catalog=whatever;
                    user id=myuserid;password=mypassword;
                    multipleactiveresultsets=True;
                    application name=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />
4
répondu John Peters 2014-09-29 16:23:42

Après des heures de recherche sur google et d'essayer de résoudre aucune des solutions proposées travaillé. J'ai énuméré plusieurs solution ici. J'ai aussi noté celui qui a fonctionné pour moi. (J'utilisais EF version 6.1.1, et SQL server 2014 - mais un DB plus ancien)

  1. reconstruire le projet et essayer à nouveau.
  2. Fermez et ouvrez VS - je ne sais pas comment cela fonctionne
  3. assurez-vous si vous avez placé le .Fichier EDMX à l'intérieur d'un répertoire, make bien sûr, vous incluez les répertoires dans votre chaîne de connexion. par exemple, la mienne est dans le dossier DAL. Il ressemble donc à ceci: connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl; (ce sont des fichiers. pour les voir, vous pouvez basculer Afficher Tous les Fichiers dans l'explorateur de solutions, sous ~/obj/.. répertoire)

...et beaucoup d'autres que j'avais essayé [comme: revenir la version Entitefram Framework à une version plus tard (pas sûr à ce sujet)]


ce qui a fonctionné pour moi:

de cet article ici , il m'a aidé à résoudre mon problème. Je viens de changer mon ProviderManifestToken="2012" en ProviderManifestToken="2008" dans le fichier EDMX. Pour ce faire:

Solution Explorer

  1. clic droit sur le fichier .edmx 151970920"
  2. Ouvrir avec..
  3. Editeur XML
  4. Changement ProviderManifestToken="XXXX" avec 2008

j'espère que ça aidera.

4
répondu ben 2015-07-29 10:27:25

dans mon cas, ce problème était lié au fait de renommer le fichier edmx de mon modèle... la correction de l'application.la chaîne de connexion config pour les fichiers csdl/ssdl/msl a corrigé mon problème.

si vous utilisez L'EF 4.0 designer pour générer votre csdl/ssdl/msl, ces 3" fichiers " seront en fait stockés dans le fichier edmx principal du modèle. Dans ce cas, le post de Waqas est à peu près à l'ordre du jour. Il est important de comprendre que "Model_Name" dans son exemple devra être modifié en quel que soit le nom actuel de votre modèle .fichier edmx (sans le .edmx).

aussi, si votre fichier edmx n'est pas au niveau racine de votre projet, vous devez préfacer Model_Name avec le chemin relatif, par exemple

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

spécifierait que le xml csdl/ssdl/msl est stocké dans le WidgetModel du fichier modèle.edmx "qui est stocké dans un dossier nommé "Monmodèle'.

3
répondu Janmon 2010-06-23 07:57:34

j'ai écrit cette classe helper pour créer des instances D'objets ObjectContext lorsqu'ils sont définis dans un projet différent de celui qui l'utilise. J'analyse la chaîne de connexion dans le fichier de configuration et je remplace '*' par le nom complet de l'Assemblée.

Il n'est pas parfait car il utilise la réflexion pour construire l'objet, mais il est le plus générique façon de faire que j'ai pu trouver.

J'espère que ça aidera quelqu'un.

public static class EntityHelper<T> 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;
    }
}
3
répondu lau 2010-07-06 16:29:24

pour tous les utilisateurs SelftrackingEntities , si vous avez suivi le parcours de Microsoft et séparé la classe de contexte objet en le projet de service de la FMC (en établissant un lien avec le contexte .tt) donc cette réponse est pour vous :

partie des réponses affichées dans ce message qui comprend le code comme:

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

NE FONCTIONNERA PAS POUR VOUS !! la raison en est que YourObjectContextType.Assembly réside maintenant dans un assemblage différent (à l'intérieur de l'assemblage du projet wcf).) ,

vous devez donc remplacer YourObjectContextType.Assembly.FullName par -- >

ClassTypeThatResidesInEdmProject.Assembly.FullName 

amusez-vous bien.

3
répondu Robocide 2010-08-08 21:16:41

j'ai eu des problèmes avec ce même message d'erreur. Mon problème a été résolu par la fermeture et la réouverture de Visual Studio 2010.

2
répondu Adam 2011-05-23 12:29:26

avait la même question parce que j'ai renommé une assemblée.

j'ai également dû le renommer en AssemblyTitle et en AssemblyProduct attributs dans le projet Properties/AssemblyInfo.cs, et aussi supprimer et ajouter de nouveau la référence au fichier edmx.

alors ça marchait très bien.

2
répondu Antoine Meltzheim 2012-03-29 15:28:29

avec le même problème j'ai recréé edmx à partir de la base de données. Résout mon problème.

2
répondu صفي 2013-10-22 13:17:57

Exception est parce que compilateur pointant vers des métadonnées non existantes donc il suffit de copier app.config connectionstring à Web.config ConnectionString

2
répondu Krishna shidnekoppa 2016-07-12 12:28:08

cela m'arrive quand je ne nettoie pas la solution avant de construire Nouveau .EDMX designer. N'oubliez donc pas de nettoyer la solution avant de construire de nouveaux .EDMX designer. Cela m'aide à sauter beaucoup plus de problèmes avec celui-ci. Ci-dessous les détails de navigation fournis dans le cas où vous êtes nouveau dans visual studio.

, Cliquez Sur->Build->Solution Propre

Puis Cliquez Sur - > Build - >Rebuild Solution

Espérons que cette aide. Merci à tous

2
répondu Liakat Hossain 2018-06-25 01:48:56

j'ai aussi eu le même problème et la même solution que selon Rick, sauf que j'importais un existant .edmx à un nouveau projet, et bien que l'espace de noms de base n'avait pas d'importance, il a été importé dans un sous-répertoire différent, donc j'ai aussi dû mettre à jour la chaîne de connexion à L'intérieur du Web.Config en trois endroits, pour inclure le nom du sous-répertoire différent:

1
répondu eagle779 2010-02-07 04:27:50

j'ai eu le même problème avec une solution qui contenait des projets dans un dossier Solution, quand ils ont été déplacés à la racine de la Solution (afin de surmonter un bug suspecté avec le Mvc3AppConverter en raison de l'emplacement du projet).

bien que la solution compilée après tout* références de projet ont été ré-ajoutés au besoin, l'erreur a été jeté lorsque le site web a été enflammé.

L'EDMX est dans l'un des projets qui a été déplacé (le projet "données" ), mais bien sûr, l'absence de référence au projet de données n'a pas causé d'erreur de compilation, juste une erreur de fonctionnement.

simplement en ajoutant la référence manquante au projet primaire résolu ce problème, pas besoin d'éditer la connexion du tout.

j'espère que cela aide quelqu'un d'autre.

1
répondu Chris 2012-01-13 18:26:03

Une mauvaise application.config ou web.fichier de configuration peuvent le faire.. J'avais copié l'application.config chaîne de connexion à mon web.config dans mon UI et a fini par entrer:

<connectionStrings>
    <connectionStrings>
          <add name="name" connectionString="normalDetails"/>
    </connectionStrings>
</connectionStrings>
1
répondu MyDaftQuestions 2014-04-18 08:27:09

Je n'avais tout simplement pas référencé Ma bibliothèque de classe qui contenait le fichier EDMX.

1
répondu PeterX 2014-06-27 06:18:43

si vous utilisez l'edmx d'un autre projet, alors dans la chaîne de connexion, changez...

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

... à ...

metadata=res://*/DataModel.csdl
1
répondu Graham Laight 2018-01-24 16:39:29

ma théorie est que si vous avez plus d'un fichier edmx avec le même nom (Model1 par exemple), il donnera cette exception. J'ai eu le même problème quand j'ai décidé de nommer tous mes fichiers edmx (assis dans des projets différents) comme Model1 parce que j'ai pensé qu'ils devraient être indépendants.

0
répondu alpav 2010-02-16 17:10:19

une autre cause de cette exception est lorsque vous incluez une table liée dans un ObjectQuery, mais que vous tapez le mauvais nom de propriété de navigation.

exemple:

var query = (from x in myDbObjectContext.Table1.Include("FKTableSpelledWrong") select x);
0
répondu soslo 2010-09-29 14:30:35