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'.
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):
Il pourrait également y avoir d'autres causes.
HTH
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();
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!)
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.
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)
.
Je l'ai également vu lorsque la chaîne de connexion n'est pas spécifiée dans le fichier de configuration.
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:
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.
Vérifiez simplement l'orthographe de la propriété avec le modèle
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.
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.
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.
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.
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.