Partage
  • Partager sur Facebook
  • Partager sur Twitter

relation entityframework many to many

postgresql

Sujet résolu
    21 juin 2019 à 14:38:22

    Bonjour,

    je débute avec entityframework. J'ai une base de donnée sous postgresql que j'ai importé dans visual studio (database first)

    voici mon problème :

    j'ai des clients qui sont liés à des employés (ces employés ont un emploi)

    Voici la classe client_employe généré

    public partial class client_employe
        {
            public long clientid { get; set; }
            [ForeignKey("clientid")]
            public virtual client client { get; set; }
    
            public long commercialid { get; set; }
            [ForeignKey("commercialid")]
            public virtual employe commercial { get; set; }
    
            public long methodeid { get; set; }
            [ForeignKey("methodeid")]
            public virtual employe method { get; set; }
    
            public long programmanagerid { get; set; }
            [ForeignKey("programmanagerid")]
            public virtual employe pm { get; set; }
    
            public long planeurid { get; set; }
            [ForeignKey("planeurid")]
            public virtual employe planeur { get; set; }
    
            public long qualiteid { get; set; }
            [ForeignKey("qualiteid")]
            public virtual employe qualite { get; set; }
            public long siteid { get; set; }
        
            
        }
     

    ma classe client

     
    public partial class client
        {
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
            public client()
            {
                this.client_employe = new HashSet<client_employe>();
            }
        
            public long id { get; set; }
            public string client1 { get; set; }
            public string adresse { get; set; }
            public string mail { get; set; }
            public string telephone { get; set; }
            public Nullable<long> divisionid { get; set; }
            public bool act { get; set; }
        
            public virtual division division { get; set; }
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
            public virtual ICollection<client_employe> client_employe { get; set; }
        }


    et ma classe employe

     public partial class employe
        {
            public long id { get; set; }
            public string nom { get; set; }
            public Nullable<long> emploiid { get; set; }
            public string prenom { get; set; }
            public string mail { get; set; }
            public string telephone { get; set; }
            public string matricule { get; set; }
        
            public virtual emploi emploi { get; set; }
        }
       

    Le problème est que je n'arrive pas à interrogé un client afin de récupérer les employés qui lui sont ratachés (commercial, qualite, programmeManager ...)

    Je pense qu'il y a un problème avec ma classe client_employe ?

    Je précise que le client n'a pas forcement d'employé de défini donc pas de foreign key.

    Cordialement,

    -
    Edité par vlad05 21 juin 2019 à 14:40:07

    • Partager sur Facebook
    • Partager sur Twitter
      21 juin 2019 à 14:57:58

      Bonjour,

      Mauvais forum

      Le sujet est déplacé de la section Base de données vers la section Langages.NET

      Sinon, en terme de modélisation, il aurait mieux valu créer une relation ternaire :

      • employe ( id [pk], etc. )
      • emploi ( id [pk], etc. )
      • client ( id [pk], etc. )
      • client_employe ( id_client [pk][fk], id_employe [pk][fk], id_emploi [pk][fk] )

      La ternaire relie pour chaque enregistrement un couple client / employé / emploi, exemple :

      • Microsoft / Jean-Claude / Commercial
      • Microsoft / Robert / Méthode
      • Microsoft / Jacqueline / Qualité
      • etc.

      vlad05 a écrit:

      Je précise que le client n'a pas forcement d'employé de défini donc pas de foreign key.

      Ce n'est pas une raison pour ne pas créer de foreign key ...

      -
      Edité par Benzouye 21 juin 2019 à 15:03:09

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        21 juin 2019 à 15:24:27

        en ce qui concerne la modélisation, étant donné que jean-claude sera toujours commercial, il y aura redondance d'information ? (ce qui ne me choc pas si ca résoud mon problème).

        Pour la foreign key, je n'ai pas réussi à la rendre nullable sous postgre.

        Ma table contient déjà des données. Je ne vois pas comment faire ?

        • Partager sur Facebook
        • Partager sur Twitter
          21 juin 2019 à 15:46:09

          Tu as juste à ne pas spécifier "NOT NULL" sur la colonne de ta clé étrangère.

          Si tes données te posent problèmes, exporte les données, supprime les données la base, fais ta modif, et importe les données

          • Partager sur Facebook
          • Partager sur Twitter
            21 juin 2019 à 15:51:21

            vlad05 a écrit:

            en ce qui concerne la modélisation, étant donné que jean-claude sera toujours commercial

            Ok, mais du coup le problème reste le même, ce ne sera plus une ternaire, mais :

            • emploi ( id [pk], etc. )
            • client ( id [pk], etc. )
            • employe ( id [pk], id_emploi [fk], etc. )
            • client_employe ( id_client [pk][fk], id_employe [pk][fk] )

            vlad05 a écrit:

            je n'ai pas réussi à la rendre nullable sous postgre

            Je ne sais pas pourquoi, mais de toute façon avec un modèle normalisé ce ne devrait pas être nécessaire de mettre des NULL. Avec le modèle proposé, un client sans lien avec des employés n'aura simplement pas d'enregistrement dans la table client_employe, et si un client et lié à plusieurs employés, il aura plusieurs enregistrements dans la table client_employe ...

            vlad05 a écrit:

            Ma table contient déjà des données. Je ne vois pas comment faire ?

            Beaucoup ? Ou juste un jeu d'essai ?

            Tu peux envisager une bascule :

            • Créer une nouvelle table client_employe_new ( clientid [pk][fk], employeid [pk][fk] )
            • Faire les INSERT INTO dans cette table :
            INSERT INTO client_employe_new ( clientid, employeid )
            	SELECT clientid, commercialid
            	FROM client_employe
            	WHERE commercialid IS NOT NULL;
            
            INSERT INTO client_employe_new ( clientid, employeid )
            	SELECT clientid, methodeid
            	FROM client_employe
            	WHERE methodeid IS NOT NULL;
            
            ...
            
            INSERT INTO client_employe_new ( clientid, employeid )
            	SELECT clientid, planeurid
            	FROM client_employe
            	WHERE planeurid IS NOT NULL;
            • Supprimer la table client_employe
            • Renommer la table client_employe_new en client_employe

            Je ne sais par contre pas te dire ce que cela implique côté .NET ...

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              5 juillet 2019 à 16:50:16

              Merci pour les conseils,

              j'ai effectivement pu rendre les colonnes nullable et ajouter les foreign key.

              Ca a résolu mon problème avec entityframework.

              Cordialement,

              • Partager sur Facebook
              • Partager sur Twitter
                5 juillet 2019 à 17:35:09

                vlad05 a écrit:

                Merci pour les conseils,

                j'ai effectivement pu rendre les colonnes nullable

                Donc tu n'as donc pas respecté les règles de normalisation ... c'est dommage ...

                • Partager sur Facebook
                • Partager sur Twitter
                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                relation entityframework many to many

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown