71 votes

Erreur de fragment de mappage d'Entity Framework 4 lors de l'ajout d'une nouvelle entité scalaire

J'ai une conception Entity Framework 4 model-first. J'ai créé une première ébauche de mon modèle dans le concepteur et tout allait bien. J'ai compilé, généré la base de données, etc.

Plus tard, j'ai essayé d'ajouter une chaîne scalaire (Nullable = true) à l'une de mes entités existantes et je continue à obtenir ce type d'erreur lors de la compilation :

Erreur 3004 : Problème de mappage des fragments à partir de la ligne 569 : Non mappage spécifié pour les propriétés MyEntity.MyValue dans Set MyEntities. Une Entité avec Clé (PK) ne fera pas l'aller-retour lorsque : L'entité est de type MyEntities.MyEntity]

Je dois toujours ouvrir manuellement le fichier EDMX et corriger le XML chaque fois que j'ajoute des scalaires.

Des idées sur ce qui se passe ?

76voto

Jason Morse Points 2149

J'ai depuis découvert qu'après avoir ajouté/modifié/supprimé les propriétés de mes entités, je dois "Générer la base de données à partir du modèle" avant de compiler, sinon j'obtiens des erreurs de mappage 3004.

42voto

avenue19 Points 141

J'ai simplement supprimé les tables incriminées du modèle, puis je les ai rajoutées et tout s'est bien passé.

30voto

Jeff Johnson Points 567

Pour ceux d'entre vous qui créent un modèle à partir d'une base de données, j'ai rencontré ce problème après avoir apporté des modifications à ma base de données. Cela s'est produit lorsque j'ai changé le nom d'un champ dans la base de données pour une raison ou une autre (je pense que cela se produit également si vous changez un type de données).

La solution, pour moi, a été de faire un clic droit sur l'espace de travail et de choisir "Update Model from Database". Cela devrait ajouter les propriétés de la base de données à votre modèle, mais cela ne supprime PAS vos anciennes propriétés, qui vous donneront l'erreur 3004.

Cliquez avec le bouton droit de la souris sur l'espace de travail et choisissez "Valider". Vous devriez obtenir une liste d'erreurs indiquant les propriétés en cause. Vous pouvez alors cliquer avec le bouton droit de la souris sur chaque propriété incriminée et la supprimer manuellement de votre modèle.

Cela a réglé le problème pour moi. J'espère que cela aidera quelqu'un d'autre.

11voto

Phil Points 153

Si vous voulez modifier votre base de données sans régénérer le modèle entier ou recréer votre base de données à partir du modèle, je trouve qu'il est plus facile et plus sûr de modifier les propriétés dans le diagramme EDMX via Visual Studio et ensuite d'ajuster manuellement les mappings auxquels Visual Studio ne donne pas accès.

L'erreur vous donnera un numéro de ligne :

Problème de mappage des fragments commençant à la ligne 569

Ouvrez simplement le fichier edmx dans un éditeur de texte, allez à cette ligne et ce qui doit être corrigé devrait être évident. Il y a une section qui ressemble à ceci :

<EntityTypeMapping TypeName="YourModel.YourType">
  <MappingFragment StoreEntitySet="YourType">
    <ScalarProperty Name="PropertyName1" ColumnName="DatabaseColumn1" />
    <ScalarProperty Name="PropertyName2" ColumnName="DatabaseColumn2" />
    ...
  </MappingFragment>
</EntityTypeMapping>

Assurez-vous simplement qu'il y a un nœud pour chaque nom de propriété/colonne dont vous avez besoin, et que toutes les propriétés sont également répertoriées dans la section <EntityType Name="YourTable"> section en haut du document edmx

1voto

Si toutes vos requêtes sont écrites dans des procédures stockées et que vous essayez simplement de remplir le modèle, vous pouvez passer à un type complexe, ce qui a fonctionné pour moi.

Comment créer un type complexe :

  1. Changez manuellement le nom de la classe classe générée par l'entité qui vous problèmes avec un nom qui n'est pas pas déjà utilisé dans votre fichier edmx.
  2. Sélectionnez la fenêtre du navigateur de modèles et cliquez avec le bouton droit de la souris et ajoutez un nouveau type complexe.
  3. Copier/coller les propriétés du modèle original vers le type complexe.
  4. Mettez en correspondance vos procédures stockées avec le type complexe.

    J'espère que cela aidera quelqu'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X