Partage
  • Partager sur Facebook
  • Partager sur Twitter

Insertion avec EF Core

    19 octobre 2018 à 10:30:11

    Bonjour, 

    J'utilise Entity Framework dans une API .NET Core (méthode code first) et j'ai un soucis lors des insertions. Par exemple j'ai un objet USER qui possède plusieurs attributs où certains d'entres eux sont également des objets complexes, par exemple VILLE dans mon cas. Et bien lorsque je vais insérer un USER "_context.Users.Add(user);" et bien il va également essayer d'insérer la VILLE qui correspond à ce USER, cependant je ne le souhaite pas car cette VILLE existe déjà dans la base de données (d'ailleurs du coup ça plante vu qu'il veut insérer une ville avec un id déjà existant), je souhaite uniquement insérer la clé étrangère IDVILLE dans la table USER.

    Savez-vous s'il existe une méthode pour dire à EF de ne pas essayé d'insérer la VILLE ?

    • Partager sur Facebook
    • Partager sur Twitter
      19 octobre 2018 à 15:55:54

      2 solutions :

      • Au moment de l'ajout du USER, tu t'assure que, d'une façon ou d'une autre, l'instance VILLE qui se trouve dans USER est rattachée au contexte de base de données utilisé. Pour ça, soit tu force la chose avec un "tonUser.VILLE = tonContext.VILLEs.Single(v => v.ID == tonUser.VILLE.ID)", soit tu utilises les méthodes Attach (du contexte ou du DbSet<>, au choix) qui sont censées te permettre de rattacher une entité à un contexte spécifique. Je dis censé parce que de mémoire, ça ne fonctionne pas systématiquement. Si tu teste ça, je veux bien ton retour d'expérience sur le sujet.
      • Tu revois ton entité USER pour exposer 2 propriétés : Une propriété du type de la clé de l'entité VILLE et une propriété de navigation VILLE. Tu peux ensuite configurer le contexte pour lui indiquer que ces 2 propriétés sont liées et représentent toutes les deux la même foreignkey. Dès lors, à l'insertion, tu as juste à t'assurer que la propriété qui contient la clé est renseignée avec une valeur valide (et tu laisse la propriété de navigation VILLE vide). Cette technique est un peu dangereuse parce que, suivant les cas d'usage (si le lazy loading est inaccessible ou désactivé par exemple), tu peux avoir la propriété de foreignkey renseignée mais la propriété VILLE non chargée, donc valorisée à null. Ca peut complexifier les codes de traitement.

      -
      Edité par Nisnor 19 octobre 2018 à 15:57:28

      • Partager sur Facebook
      • Partager sur Twitter
        22 octobre 2018 à 16:44:42

        public void Insert(Event eventElmt)
                {
                    _context.Events
                        .Add(eventElmt);
                    _context.Entry(eventElmt.City).State = EntityState.Unchanged;
                    _context.SaveChanges();
                }

        La solution que j'ai trouvée est celle ci, à savoir ajouter la ligne "_context.Entry(eventElmt.City).State = EntityState.Unchanged;" à ma DAL

        • Partager sur Facebook
        • Partager sur Twitter
          22 octobre 2018 à 20:08:03

          Vu qu'il existe d'autres solutions qui ne détournent pas le fonctionnement normal du framework, personnellement, je n'opterais pas pour ça.

          Bon à savoir cela dit, merci pour le code :)

          -
          Edité par Nisnor 22 octobre 2018 à 20:08:18

          • Partager sur Facebook
          • Partager sur Twitter

          Insertion avec EF Core

          × 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