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 :

EF Manipuler les relations Many-To-Many


Sujet :

Entity Framework

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 35
    Points
    35
    Par défaut EF Manipuler les relations Many-To-Many
    Bonjour à vous,

    Dans le cadre d'un projet personnel en ASP.Net MVC3 je souhaite manipuler à plusieurs reprise des relations Many-To-Many.

    J'ai réussi avec beaucoup de mal à enregistrer les données... en passant j'aimerais votre avis sur la façon de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            public void setEmploye(employe _employe, List<int> employeZone)
            {
                using (Entities contexte = new Entities())
                {
                    contexte.AddObject("employe", _employe);
     
                    foreach(int Czones in employeZone){
                        zone Czone = contexte.zone.Single(t => t.ID == Czones);
                        _employe.zone.Add(Czone);
                    }
     
                     contexte.SaveChanges();
                }
            }


    Tout ceci fonctionne très bien seulement je n'arrive pas à supprimer un employe car il faut supprimer avant la relation (si j'ai bien compris).

    En parcourant le web j'ai tenté mais sans y parvenir et voila où j'en suis:

    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
    17
    18
    19
    20
    21
    22
    23
            public void delEmploye(int id)
            {
                using (Entities contexte = new 
     
    Entities())
                {
                    employe Cemploye = getEmployeById(id);
     
     
                    // Get the subscription you want to delete
                    List<zone> lzone = (from _zone in contexte.zone
                                        where _zone.employe.Equals(Cemploye)
                                        select _zone).ToList();
                    foreach (var Czone in lzone)
                    {
                        Cemploye.zone.Attach(Czone); 
                        Cemploye.zone.Remove(Czone);
                    }
                    contexte.Attach(Cemploye);
                    contexte.DeleteObject(Cemploye);
                    contexte.SaveChanges();
                }
            }

    Le problème est que ma clause where n'est pas correcte et je pense être loin du but.

    Je n'ai pas non plus fait de jointure Many-To-Many, j'espère qu'un simple Include("zone") me permettra de réaliser la jointure.

    Je vous remercie d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    As-tu essayé ça (plus simple à mon avis) ?
    Code C# : 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
    17
     
    public void delEmploye(int id)
            {
                using (Entities contexte = new  Entities())
                {
                    employe Cemploye = (from emp in contexte.employe.include("zone")
                                                 where emp.Id == id
                                                 select emp).FirstOrDefault();
                    if(emp == null) return;
     
                    var zones = Cemploye.zone;
                    foreach(var zone in zones)
                          contexte.DeleteObject(zone);
                    contexte.DeleteObject(Cemploye);
                    contexte.SaveChanges();
                }
            }

    Autres solutions :
    • Mettre en place la suppression en cascade côté SGBDR : dans ce cas pas besoin de charger les zones
    • Mettre en place la suppression en cascade côté EF : dans ce cas on aura toujours besoin de charger les zones mais pas besoin de dire à EF de les supprimer de façon explicite.

    PS :
    • Bizarre de supprimer un employé. On privilégie le plus souvent un flag pour spécifier la suppression (appelée suppression logique) mais pas la suppression physique (suppression de la base de données et perte de l'historisation).
    • Active la "pluralisation" cela te permet d'avoir un "s" sur les propriétés de navigation de type collection et permet de gagner beaucoup en lisibilité.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 35
    Points
    35
    Par défaut
    Effectivement c'est mieux de garder l’employé dans la table, mais ce n'est pas bien grave c'est un projet personnel qui n'a pas vocation commerciale c'est uniquement pour apprendre. Merci tout de même pour la critique

    Je mis pencherais sur le prochain projet pour améliorer la lisibilité de mon code également car je peux m'y perdre moi même.


    Par contre pour ce qui est de la modification j'ai une erreur sur le foreach:

    La collection a été modifiée ; l'opération d'énumération peut ne pas s'exécuter.
    Ce qui me surprend c'est de supprimer l'objet zone. Ce que je souhaite c'est uniquement supprimer la relation entre l'employé et la zone c'est a dire supprimer la ligne correspondante dans la table zoneEmploye.

    En tout cas merci à toi de m'aider à résoudre tous mes problèmes



    EDIT:Je me suis surement mal exprimé le code qui fonctionne est très simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                using (Entities contexte = new Entities())
                {
                    employe Cemploye = (from _employe in contexte.employe.Include("zone")
                                        where _employe.ID.Equals(id)
                                        select _employe).First();
     
     
                    contexte.DeleteObject(Cemploye);
                    contexte.SaveChanges();
     
                }
            }

    il me manquait juste l'Include("zone") ..

    Erreur de débutant

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 35
    Points
    35
    Par défaut
    Bonjour à vous,

    Je n'ai pas trop eu le temps de travailler sur l'application mais pour gagner du temps je post un Énième message ...

    Je n'arrive pas non plus à éditer un employé avec ses zones.

    En gros dans ma vue je retourne un objet client et une List<int> avec les différentes zones qui lui sont affectées.

    Seulement je n'ai pas compris comment fonctionne les requêtes pour EF.
    quoi que je fasse j'ai une erreur soit au savechanged soit lorsque j'attache les zones à l'objet client.

    voila le bout de code :

    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
    17
    18
            public void uploadEmploye(employe _employe, List<int> employeZone)
            {
                using (Entities contexte = new Entities())
                {
     
                    contexte.employe.Attach(_employe);
     
     
                    foreach (int Czones in employeZone)
                    {
                        zone Czone = contexte.zone.Single(t => t.ID == Czones);
                        _employe.zone.Add(Czone);
                    }
     
                    contexte.ObjectStateManager.ChangeObjectState(_employe, EntityState.Modified);
                    contexte.SaveChanges();
                }
            }
    et l'erreur :
    Une instruction de mise à jour, d'insertion ou de suppression dans le magasin a affecté un nombre inattendu de lignes (0). Des entités ont peut-être été modifiées ou supprimées depuis leur chargement. Actualisez les entrées ObjectStateManager.
    J'ai l'impression de vous solliciter trop souvent et de pas avancer beaucoup, mais sachez que je fouille quand même un moment avant de poster ici.

    Merci à vous !

Discussions similaires

  1. PGSQL-EclipseLink Relation One To Many et Many To One
    Par faitor1 dans le forum Persistance des données
    Réponses: 0
    Dernier message: 30/01/2015, 19h46
  2. Afficher les relations many to many
    Par jillthe1 dans le forum Doctrine2
    Réponses: 6
    Dernier message: 31/12/2011, 17h05
  3. [Access] Manipuler les relations
    Par s.n.a.f.u dans le forum Accès aux données
    Réponses: 2
    Dernier message: 02/04/2007, 09h27
  4. Un peu de mal a comprendre le concepte "one-to-many" et "many-to-many"
    Par chriscoolletoubibe dans le forum Hibernate
    Réponses: 4
    Dernier message: 29/03/2007, 18h50
  5. Réponses: 3
    Dernier message: 26/02/2007, 10h14

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