web-dev-qa-db-fra.com

Le mappage EF et les informations de métadonnées sont introuvables 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é qui s'appelle Procurement.EFDataProvider et mes classes POCO sont à l'intérieur d'un autre Assembly Procurement.Core La relation entre Core (Business Logic) et EFDataProvider (Data Access) est avec une fabrique nommée DataProvider

donc quand j'essaye de créer un ensemble d'objets

objectSet = ObjectContext.CreateObjectSet<TEntity>();

Je reçois une erreur:

Les informations de mappage et de métadonnées sont introuvables pour EntityType 'Procurement.Core.Entities.OrganizationChart'.

38
Reza Zareian

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

  • Propriétés mal orthographiées (sensibles à la casse!)
  • Propriétés manquantes dans la classe POCO
  • Non-concordance de type entre le POCO et le type d'entité (par exemple, int au lieu de long)
  • Énumérations dans le POCO (EF ne prend pas en charge les énumérations pour le moment, si je comprends bien)

Il pourrait également y avoir d'autres causes.

HTH

61
joniba

Cela est probablement dû au fait qu'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

C'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 assemblages chargés. Si l'assembly 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'endroit où vos informations de mappage sont intégrées. Remplacez * par le nom d'assembly spécifique de votre code de mappage:

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

Si cela échoue, trouvez l'assembly et chargez-le directement dans votre ObjectContext en utilisant:

ObjectContext.Metadataworkspace.LoadFromAssembly();
12
John Farrell

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 standard: mauvaise idée!

Voir aussi le commentaire de JRoppert sur EF4 POCO (n'utilisant pas T4): les informations de mappage et de métadonnées sont introuvables pour EntityType (merci JRoppert!)

3
Roy de Boer

J'obtenais cette erreur parce que j'avais plus d'un fichier edmx dans le même assembly sans utiliser correctement les espaces de noms personnalisés.

Voici ce qui est dit à propos de l'exception dans System.Data.Objects.ObjectContext

// Des 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
Ken

Un autre problème possible est si vous utilisez le code en premier et que votre type d'entité est défini dans un assembly séparé à l'endroit où le contexte est défini et si vous n'avez ajouté aucun mappage personnalisé à 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
Danny Varod

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

2
Anish

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

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

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

  1. Ouvrez le directeur bin de votre projet exe et gardez-le visible.
  2. Créez 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. Pendant que d'autres projets sont générés, vous verrez que la date de modification du projet DataAccess a été remplacée par 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
Jacob Wakeem

Vérifiez simplement l'orthographe de la propriété avec le modèle

1
soumitra ghosh

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

J'ai personnalisé POCO et en copiant le fichier edmx dans un nouveau projet vierge et je l'ai laissé générer automatiquement les entités, puis les comparer à ce que j'avais aidé à trouver la différence.

1
aishelm

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
Ammar

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

Dans les mappages de table, j'avais renommé les noms de colonne.

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 de cette table dans Domain.Poco.tt était correcte, mais j'ai trouvé le fichier class.Metadata.cs correspondant dans Domain.Poco.MetaData.tt n'avait pas été mis à jour et avait les nouvelles colonnes avec les noms d'origine - pas la nouvelle ceux que j'avais spécifiés dans Table Mapping.

Solution? Je viens de supprimer la classe de métadonnées incriminée et j'ai relancé "Transformer tous les modèles" et il a été recréé correctement, avec les noms de colonne/fonction corrects.

0
cyberspy

J'avais un problème similaire. J'avais déjà un fichier EDMX pour une base de données utilisant des classes POCO et un objet Context que j'ai écrit moi-même. Lorsque 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 des EDMX n'a ​​fonctionné et n'a généré l'erreur que vous avez mentionnée. Pour le résoudre, j'ai mis au rebut mon POCO et mon contexte personnalisés et j'ai utilisé uniquement le modèle T4 et tout a bien fonctionné à nouveau.

0
Walter

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 fait que la base de données ne correspond pas 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
WVDominick