IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Accès aux données Discussion :

[EF][C#] Problème pour mapper 2 tables vers 1 objet


Sujet :

Accès aux données

  1. #1
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Points : 104
    Points
    104
    Par défaut [EF][C#] Problème pour mapper 2 tables vers 1 objet
    Bonjour à tous,

    Je rencontre un problème de modélisation sous Linq To Entities qui me semble pourtant assez simple.

    Je désire modéliser 2 tables au sein d'un seul objet.

    Les tables sont les suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    [Adresse]
    id_Adresse int
    rue nvarchar(100)
    numero int
    boite nvarchar(100)
    Id_CodePostal int
     
    [Code Postal]
    id_CodePostal int
    codePostal int
    Commune nvarchar(100)
    Il y a bien entendu une relation entre ses 2 tables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Adresse(1,1) ----- (0,n)Code Postal
    Quand je crée mon Entity Data Model à partir de visual Studio, je me retrouve dans un premier temps avec un ORM de type 1:1, j'ai donc 2 objets (Adresse et Code Postal).

    Vu que je désire fusionner ces 2 objets en 1 seul, je supprime l'objet Code Postal et je recrée dans l'objet Adresse les champs qui m'intéresse de l'objet Code Postal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    - codePostal
    - Commune
    Ensuite, je vais dans le mapping details de l'objet Adresse et je rajoute la table CodePostal en mappant les attributs correspondant.

    Dès que je compile je recois cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Error	1	Error 3024: Problem in Mapping Fragment starting at line 539: Must specify mapping for all key properties (Adresse.Id_Adresse) of the EntitySet Adresse.
    	D:\Temp\TestLinq\DAL_EFW\modele.edmx	540	15	DAL_EFW
    Vous pouvez voir les détails dans le fichier attaché.

    Est ce que quelqu'un peut m'éclairer sur ce problème car cela me semble si simple.
    Images attachées Images attachées  

  2. #2
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Points : 443
    Points
    443
    Par défaut
    Bonjour,

    tu as inversé quelques trucs quand tu as créé et mappé ton entité.
    Tout d'abord, la clé d'entité doit être portée par la propriété IdCodePostal.

    Ensuite, supprimes la propriété Id_Adresse, et mappe la colonne Id_Adresse sur avec la propriété IdCodePostal. Ceci est normal, car Id_Adresse est possède la même valeur que Id_CodePostal (relation (1;1) -> (0;n)).

  3. #3
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Paul : je débute en EntityFramework (commencé ce midi).
    D'ailleurs je viens de terminer la lecture de ton article et il est très intéressant et très complet.
    C'est un excellent tutoriel pour l'Entity Framework.

    En revanche je ne suis pas d'accord avec ta réponse.
    En l'occurence, l'entité c'est bien l'adresse, et sa clef l'ID de l'adresse :
    c'est elle qu'on veut utiliser ailleurs pour l'associer à nos utilisateurs, avec une belle relation 1-> n (plusieurs clients ont la même adresse s'ils habitent le même immeuble).

    De même pour les codes postaux : si chaque code postal a son ID propre (perso j'aurais utilisé le code postal comme ID mais passons), alors j'imagine qu'il y a une relation 1 -> n entre l'adresse et le code postal : 1 adresse possède 1 seul code postal, mais 1 code postal est associé à plusieurs adresses.

    Donc on ne peut pas identifier notre adresse par l'ID de notre code postal...

    Sinon je rencontre exactement le même problème que badack avec le même message d'erreur. Et je cherche encore la réponse. Plus d'info post suivant.

  4. #4
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Voici mon problème :
    * J'ai une table Skill reliée à une table Attribute par un champ IdAttribute
    * 1 skill possède 1 unique attribut, mais 1 attribut est associé à n skills
    (voir première pièce jointe)

    Dans mon application, je n'en n'ai rien à cirer de l'ID de l'attribut, d'autant qu'il ne change pas (pas dans cette application là en tout cas)
    En revanche j'ai absolument besoin de son nom.

    Solution : grâce à la magie de EntityFramework, la solution idéal pour faire du Domain-driven-design (DDD), Je veux donc agréger le titre de l'attribut dans mon entité Skill.

    Et là, c'est le drame : Error 5 Error 3024: Problem in Mapping Fragment starting at line 273: Must specify mapping for all key properties (Skills.ID) of the EntitySet Skills.

    Toute explication serait la bienvenue, merci
    Images attachées Images attachées   

  5. #5
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Bon... j'ai fini par la trouver la réponse.

    En fait on ne peut faire ce genre d'opération ('fusionner' deux tables en 1 entité) que si elles partagent le même identifiant.

    Pourquoi ? Tout simplement à cause de l'UPDATE.

    On va reprendre l'exemple de badack :
    * Imaginons qu'il ai réussi à fusionner Adresse et CodePostal en une Entité AdresseEx
    * Il récupère une AdresseEx (ex : sur Toulouse)
    * Il met à jour le code postal (ex : Montpellier)
    * Il enregistre

    ==> Et là toutes les adresses sur Toulouse se retrouvent soudain sur Montpellier !!
    Dans cet exemple par l'absurde, EF (l'Entity Framework) a bien fait ce qu'on lui a demandé : il a mis à jour le code postal avec l'id 54343192.
    Mais ce n'est pas ce que voulait faire le développeur.
    Donc ce cas est interdit par le designer de VS.Net.


    En cherchant un peu on trouve une solution pour faire cette fusion (dans les articles en anglais ci dessus), mais :
    * Il faut éditer les fichier XML à la main
    * Il faut renoncer au designer de modèle derrière (sinon il va écraser vos modifs )
    * Il faut renoncer aux update sur ces entités

    Perso j'aurais préféré pouvoir faire ce que je veux avec le designer, car on a fréquemment besoin de synthétiser certaines données qu'on n'ira jamais modifier, dans un frontoffice par exemple, quitte à faire un autre modèle pour le backoffice.


    Source : le forum MSDN (en anglais)
    http://social.msdn.microsoft.com/for...-8a3a83377317/
    http://social.msdn.microsoft.com/for...-466fb22471ac/

  6. #6
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Points : 443
    Points
    443
    Par défaut
    Bonjour Mose,

    tu ne peux fusionner 2 entités mappées sur 2 tables distinctes que s'il existe une relation (1,1) -> (0,1) entre elles. C'est clair qu'il va falloir que badack ne peut le faire cette manipulation qu'en modifiant au préalable sa base de données.

Discussions similaires

  1. Problème d'extration de table vers un CSV
    Par Genohunter dans le forum Sql*Plus
    Réponses: 3
    Dernier message: 09/08/2007, 10h46
  2. Réponses: 2
    Dernier message: 03/04/2007, 10h28
  3. Réponses: 5
    Dernier message: 29/03/2007, 17h00
  4. Réponses: 3
    Dernier message: 06/01/2007, 18h44
  5. Problème pour lier deux tables
    Par balabonov dans le forum Access
    Réponses: 8
    Dernier message: 21/12/2005, 14h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo