"Informations de métadonnées non trouvées" lors de l'utilisation du modèle POCO d'EF4?

efpocoadapter entity-framework poco

Question

Je viens d'installer le modèle POCO pour EF4. J'ai une seule entité dans mon modèle, AnnouncementText , et les fichiers T4 semblent être correctement générés. Tenter d'accéder à cette nouvelle entité génère l'erreur suivante lorsque MyObjectContext.AnnouncementTexts propriété générée automatiquement, MyObjectContext.AnnouncementTexts :

InvalidOperationException: les informations de mappage et de métadonnées sont introuvables pour EntityType 'MyNamespace.AnnouncementText'.

Les propriétés du POCO AnnouncementText semblent correspondre aux colonnes de la base de données et je n'ai modifié aucun code généré automatiquement.

La trace de la pile est:

   at System.Data.Objects.ObjectContext.GetTypeUsage(Type entityCLRType)
   at System.Data.Objects.ObjectContext.GetEntitySetForNameAndType(String entitySetName, Type entityCLRType, String exceptionParameterName)
   at System.Data.Objects.ObjectContext.CreateObjectSet[TEntity](String entitySetName)
   at MyNamespace.MyObjectContext.get_AnnouncementTexts() in C:\<snip>\MyObjectContext.Context.cs:line 65
   at MyNamespace.Class1.Main() in C:\<snip>\Class1.cs:line 14

Si je supprime les fichiers .tt de la solution et .tt la génération de code sur le modèle, je peux accéder à la propriété sans problème.

Voici mon code, au cas où cela pourrait aider:

using (var context = new MyObjectContext())
   foreach (var at in context.AnnouncementTexts)
      Console.WriteLine(at.Title);

Des idées sur ce qui pourrait être faux?

Réponse acceptée

J'ai récemment rencontré à nouveau cette même erreur lors du déplacement de mon fichier EDMX vers un nouvel emplacement de la solution. Apparemment, il existe plusieurs espaces de noms différents dans les fichiers EDMX. Il y a l'espace de nom que vous entrez via l'assistant lors de la création du fichier EDMX initial (N1), un autre qui apparaît dans le SSDL et qui ressemble à ceci (N2):

<Schema Namespace="..." ..

Ensuite, il y a l'espace de noms du code généré qui peut (éventuellement) être spécifié dans le concepteur (N3), et enfin, il y a les espaces de noms masqués des ressources compilées dans votre assemblage final (N4).

D'après ce que je peux dire, l'espace de noms N2 n'est vraiment pertinent que dans le SSDL. Je crois que cet espace de noms commence par N1 - celui que vous avez initialement entré dans l'assistant.

De même, l’espace de noms N3 n’est pertinent que dans l’habitude des espaces de noms C #.

Voici la partie problématique. Les espaces de noms de catégorie N4 sont une fonction du répertoire dans lequel réside votre EDMX (par rapport au répertoire de votre projet). Vous pourriez penser, alors quoi? Il s'avère que ces espaces de noms sont également référencés dans votre fichier App.config! Plus précisément, recherchez une pièce comme celle-ci:

connectionString="metadata=res://*/Database.Master.csdl|...

Cette partie qui lit "Database.Master.csdl" est le nom de votre ressource CSDL. Si ces noms de ressources ne sont plus synchronisés, vous recevrez une erreur comme celle ci-dessus, ou peut-être:

Le nom EntityContainer par défaut '[nom]' est introuvable dans les informations de mappage et de métadonnées.

La solution simple consiste à modifier votre App.config pour spécifier le nom de ressource correct pour chaque partie de votre mappage EF (CSDL, SSDL et MSL). Si vous ne savez pas exactement quels sont ces noms, consultez les ressources de votre assembly compilé dans ILSpy ou dotPeek .


Réponse populaire

Si vous copiez un fichier EDMX dans un autre projet, l'action de construction (dans le volet Propriétés) rétablira la valeur par défaut "Aucune" dans le projet cible, ce qui peut entraîner l'erreur "Nom EntityContainer.. , ce qui est dû au fait qu’aucune ressource n’est générée. (Dans ce cas, il n'y aura plus de ressources lorsque vous ouvrirez la DLL contenant le modèle dans Reflector.) Définissez l'action de construction sur "EntityDeploy" et reconstruisez la solution pour corriger le problème.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow