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

Entity Framework Discussion :

Création objet avec relation many-to-many


Sujet :

Entity Framework

  1. #1
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut Création objet avec relation many-to-many
    Hello tout le monde.

    Je suis débutant en EF... J'ai ma première application, toute bête, et j'arrive à effectuer de opérations de CRUD sans problème sur des objets simples.
    Mais je bloque sur un truc, et j'arrive pas à trouver d'informations dessus.

    - EntityFramework 6
    - Database-First

    - J'ai créé une table produit, une table référence, et une table relationnel Produit-Référence, qui ne contient donc que deux colonnes : ID_Produit et ID_Référence

    -> Lors de l'import du modèle, la table relationnel n'est pas importé, mais dans Produit et Référence, il y a donc une liste de l'autre type.
    -> Dans l'objet Produit, il y a donc une propriété List(Of Référence).

    - J'ai créer des références...

    -> Et là je veux créer mon premier produit... J'ai remplis les infos de Produit... Et pour lui indiqué DES références... Et bien j'ai tout naturellement fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonPRoduit.ListeReference.Add(MaReference)
    - Je suis en Automatic-detect-changes

    -> Et là ça bug, parce qu'il me dis qu'il va y avoir un doublon dans référence (clé d'unicité sur le nom).
    Or c'est pas ce que je veux faire...
    Pour moi, il aurait dû créer un enregistrement dans la table relationnel... Mais comme Produit est en mode "création", alors les objets références contenus, ont aussi le statut "création" ?

    Comment faire autrement ?

    Merci d'avance !!
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  2. #2
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Salut,

    Pour faire simple Entity framework ne détecte pas que ta "référence" existe déjà en base...
    La détection des changements marche quand tu utilises ton Model dans ton DbContext (dans un using).

    Le plus simple est de récupérer tes références quand ton DbContext est ouvert :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Reference reference
        using (var context = new ModelDbContext())
        {
            reference = context.References.FirstOrDefault();
        }
     
        var produit = new Produit();
        //...
        produit.Reference = reference;
     
        using (var context = new ModelDbContext())
        {
            var exisitingReference = context.References.First(r => r.Id == produit.Reference.Id);
            produit.Reference = existingReference;
            context.SaveChange();
        }
    Désolé si c'est pas très clair j'ai essayé de faire avec tes noms de propriétés...
    Désolé 2 tu feras la conversion en VB.net

  3. #3
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Hello,

    Merci de votre réponse...

    Je crois que j'ai compris l'idée, mais juste sur le code... Vous ne faites pas deux fois la même choses ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     produit.Reference = reference;
    Et plus bas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        var exisitingReference = context.References.First(r => r.Id == produit.Reference.Id);
            produit.Reference = existingReference;
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  4. #4
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    En fait, ce que je comprends :

    C'est que d'une part dans mon code, je récupère la Référence, je le lie au produit...

    Et au moment de la sauvegarde, je récupère la référence de DBContext, et je refais la liaison...

    Pourquoi pas... Mais ce n'est quand même pas pratique du tout non ?

    Je développe en couche (avec une DAL), qui est censé me mettre à jour le produit...
    Mais comment dans la DAL je suis supposé savoir que j'ai ajouté une référence ?

    Il faudrait systématiquement refaire les liaisons ? dans le doute ? chaud non ?


    PS : (en plus je comprends pas pourquoi il ne la trouve pas... la Référence a un identifiant, il ne devrait pas être capable de savoir qu'elle existe ? au lieu de la créer)
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  5. #5
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Quand tu es en dehors du context d'EntityFramework. Il n'y a pas de détection de changement ou si l'entité existe déjà en base.

    Voici des liens qui expliquent la démarche :

    Lien 1
    Ici on peut voir ce qu'on appelle le mode connecté et déconnecté (dans un context ou en dehors).

    Lien 2
    L'utilisation d'une enum pour gérer l'état de ton objet

  6. #6
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Merci pour les liens, je vais lire tout ça.
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  7. #7
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Ok, j'ai bien tout lu... Instructif... Hélas, je persiste à dire... que c'est nul (Pour les relations Many-To-Many tout du moins).

    Si on reprends ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     using (var context = new ModelDbContext())
        {
            var exisitingReference = context.References.First(r => r.Id == produit.Reference.Id);
            produit.Reference = existingReference;
            context.SaveChange();
        }
    Ca fonctionne, c'est lisible... Si il n'existe qu'une référence à mon produit.


    Mais dans mon cas, je veux créer un produit avec 3 références...

    Alors, il faut faire une boucle sur produit.Reference, pour récupérer tous les ID, ensuite on charge ces références dans le nouveau DBContext, et on écrase les références déconnectés par les connectés dans mon produit.

    Et si je veux mettre à jour mon produit, il faudra que je fasse ça à chaque fois... (sinon, il va vouloir me créer de nouvelles références à chaque fois...)

    Et si mon produit est lié à 15 tables Many-To-Many, alors il faut boucler sur toutes les propriétés, recharger tous les éléments, pour qu'il comprenne que les différents objets liés existent...

    Il y a forcement un truc qui m'échappe...
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  8. #8
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    En gros le mode déconnecté n'existe pas...

    Il faut se reconnecter, recharger l'objet à mettre à jour, toutes les objets liés, et mettre à jour.

    En fait, c'est à nous d'écrire le mode déconnecté, car on ne peut mettre à jour que des objets connectés...
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  9. #9
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    En tombant la dessus, je trouve que finalement ça se gère pas si mal.

    Il fallait connaitre quelques astuces EF, pour rendre les choses un peu plus simple :

    http://www.entityframeworktutorial.n...dbcontext.aspx
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] Embed form avec relation one to many
    Par dyron dans le forum Symfony
    Réponses: 8
    Dernier message: 24/07/2014, 09h07
  2. lister une table avec relation one-to-many
    Par dublow dans le forum ASP.NET MVC
    Réponses: 1
    Dernier message: 27/10/2010, 10h42
  3. Problème avec Composite-Id (mapping many-to-many))
    Par ammouna24 dans le forum Hibernate
    Réponses: 0
    Dernier message: 07/05/2009, 11h43
  4. création objet avec l ouverture d un fichier excel
    Par levac dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 30/07/2007, 15h51
  5. Réponses: 2
    Dernier message: 29/08/2006, 10h40

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