Les informations de mappage EF et de métadonnées n'ont pas pu être trouvées pour L'erreur EntityType

J'ai rencontré une exception lorsque J'utilise Entity Framework 4.0 RC. Mon modèle Entity Framework est encapsulé dans un assembly privé dont le nom est Procurement.EFDataProvider et mes classes POCO sont à l'intérieur d'un autre approvisionnement d'assemblage.Core La relation entre Core (Business Logic) et EFDataProvider(Data Access) est avec une usine nommée DataProvider

Donc, quand j'essaie de créer un objectset

objectSet = ObjectContext.CreateObjectSet<TEntity>();

Je reçois une erreur:

Cartographie et métadonnées introuvable pour EntityType 'Procurement.Core.Entité.OrganizationChart'.

37
demandé sur CodeConstruct 0000-00-00 00:00:00

13 réponses

Pour toute autre personne traitant de l'erreur, je pense qu'il vaut la peine de mentionner certains scénarios que j'ai trouvés qui causent cette erreur (extrêmement inutile):

  • propriétés mal orthographiées (sensibles à la casse!)
  • propriétés manquantes dans la classe POCO
  • Type discordances entre le POCO et entity-type (par exemple, int au lieu de long)
  • Enums dans le POCO (EF ne supporte pas les enums en ce moment si je comprends bien)

Il pourrait y avoir d'autres causes Bien.

HTH

60
répondu joniba 2010-08-09 11:33:55

C'est probablement parce que EF ne peut pas trouver les informations de mappage intégrées. Dans votre chaîne de connexion, vous aurez probablement quelque chose comme le sien:

metadata=res://*/Models.MyModels.csdl|...etc

Ce * est un caractère générique, indiquant au contexte de l'objet d'essayer de trouver les informations de mappage intégrées à partir, je pense, de l'analyse de tous les assemblys chargés. Si L'assemblage n'est pas chargé, EF ne le trouvera pas.

Ce que vous devez faire est de fournir à la chaîne de connexion plus d'informations sur l'emplacement de vos informations de mappage imbriqué. Remplacez le * par le nom d'assemblage spécifique de votre code de mappage:

metadata=res://Procurement.EFDataProvider/Models.MyModels.csdl

Si cela échoue, recherchez L'Assembly et chargez-le directement dans votre ObjectContext en utilisant:

ObjectContext.Metadataworkspace.LoadFromAssembly();
12
répondu jfar 2010-03-01 05:13:53

Pas directement lié à ce qui précède, mais si vous obtenez ce message d'erreur et que vous avez mélangé un POCO et un modèle régulier: mauvaise idée!

Voir Aussi Le Commentaire de JRoppert à EF4 POCO( n'utilisant pas T4): Les informations de mappage et de métadonnées n'ont pas pu être trouvées pour EntityType (Merci JRoppert!)

3
répondu Roy de Boer 2017-05-23 10:31:20

Je recevais cette erreur parce que j'avais plus de fichier edmx dans le même assemblage sans utiliser correctement les espaces de noms personnalisés.

Voici ce qui est dit à propos de L'exception dans le système.Données.Objet.ObjectContext

// Exceptions:

    //   System.InvalidOperationException:
    //     When the System.Data.Metadata.Edm.EntitySet from entitySetName
    //     does not match the System.Data.Metadata.Edm.EntitySet of the object’s
    //     System.Data.EntityKey.
    // -or-
    //     When the System.Data.Objects.ObjectContext.DefaultContainerName
    //     property is not set on the System.Data.Objects.ObjectContext and 
    //     the name is not qualified as part of the entitySetName parameter.
    // -or-
    //     When the specified type belongs to more than one entity set.
2
répondu Ken 2011-09-09 15:50:57

Je l'ai également vu lorsque la chaîne de connexion n'est pas spécifiée dans le fichier de configuration.

2
répondu Anish 2012-01-07 01:02:56

Un autre problème possible est, Si vous utilisez code-first et que votre type d'entité est défini dans un assembly séparé où le contexte est défini et que vous n'avez pas ajouté de mappages personnalisés à la méthode OnModelCreating(DbModelBuild modelBuilder), EF semble ignorer les annotations de données.

Solution:

Ajoutez modelBuilder.Entity<YourEntityType>(); à la méthode OnModelCreating(DbModelBuild modelBuilder).

Article connexe .

2
répondu Danny Varod 2015-01-14 11:51:27

Il suffit de vérifier l'orthographe de la propriété avec le modèle

1
répondu soumitra ghosh 2010-07-13 18:12:01

Il pourrait y avoir une autre raison. J'ai aussi tiré mes cheveux pour une nuit.

Je me suis avéré qu'il y avait un certain désordre dans les références dans la solution. Dans mon projet, la edmx appartient à un projet appelé DataAccess.Dll. Mais je n'ai aucune référence à cela de mon exe. De mon exe j'ai une référence à un autre projet appelé Business.Dll, et ce projet est une référence et ancien emplacement de la DataAccess.DLL.

Faites le test suivant pour voir si vous avez un tel problème:

  1. ouvrez le bac directeur de votre projet exe et le garder visible.
  2. construisez la solution.
  3. le premier projet qui sera construit est le projet d'accès aux données, et vous pouvez voir dans le dossier bin l'heure actuelle comme sa date de modification.
  4. Alors que d'autres projets sont construits, vous verrez que la date modifiée du projet DataAccess a été changée en une ancienne.

Vous devez vérifier vos références et vous assurer qu'elles se réfèrent aux emplacements de mise à jour de vos DLL.

1
répondu Jacob Wakeem 2012-01-20 13:06:25

Dans mon cas, c'était essentiellement le même problème, le mappage n'étant pas exactement comme prévu. Ce qui m'est arrivé, c'est que j'avais déplacé une propriété dans un "héritage de table par hiérarchie" de l'une des sous-classes à la classe de base et j'ai oublié de mettre à jour le modèle.

J'ai un POCO personnalisé et en copiant le fichier edmx dans un nouveau projet vide et en le laissant générer automatiquement les entités, puis en les comparant à ce que je m'étais aidé à trouver la différence.

1
répondu aishelm 2012-10-21 16:11:51

Une erreur noob, mais j'ai eu l'erreur lorsque mon accès à la base de données était avec un nom d'utilisateur et un mot de passe en lecture seule. J'espère que mes erreurs aident les autres.

0
répondu Ammar 2012-02-08 18:36:02

J'ai eu un problème similaire. J'avais déjà un fichier EDMX pour une base de données en utilisant des classes POCO et un objet de contexte que j'ai écrit moi-même. Quand j'ai ajouté un deuxième EDMX pour une base de données différente, j'ai utilisé le modèle poco T4, puis aucun EDMX n'a fonctionné et a jeté l'erreur que vous avez mentionnée. Pour le résoudre, j'ai mis au rebut mon poco et mon contexte personnalisés et utilisé uniquement le modèle T4 et tout a bien fonctionné à nouveau.

0
répondu Walter 2012-04-27 20:38:57

J'ai eu un problème où j'avais ajouté quelques colonnes à une table.

Dans les mappages de Table, j'avais renommé les noms de colonnes.

Bien que j'aie exécuté 'transformer tous les modèles' et reconstruit l'application, j'ai toujours l'erreur' le type de métadonnées associé pour le type contient les propriétés ou champs inconnus suivants'.

La classe pour cette table dans Domain.Poco.tt était correct, mais j'ai trouvé la classe correspondante.Métadonnées.fichier cs dans Domain.Poco.MetaData.tt n'avait pas mis à jour, et avait les nouvelles colonnes avec les noms d'origine - pas les nouvelles que j'avais spécifiées dans le mappage de Table.

Solution? Je viens de supprimer la classe de métadonnées incriminée et de relancer 'Transform All Templates' et elle a été recréée correctement, avec les noms de colonne/fonction corrects.

0
répondu cyberspy 2012-05-02 10:18:24

Mon problème était que j'avais édité le modèle T4 pour exclure le champ de réplication nommé "msrepl_tran_version". Cela a empêché la base de données de correspondre aux classes générées, ce qui peut provoquer ce message d'erreur. Assurez-vous simplement que votre base de données et vos classes correspondent.

0
répondu WVDominick 2013-06-04 14:41:34