9
votes

Mise à jour de la propriété de navigation de plusieurs à plusieurs dans l'entité Framework 6, changements non enregistrés

Je tire mes cheveux pendant environ 2 jours maintenant, car je ne peux tout simplement pas obtenir EF pour enregistrer des modifications chaque fois que j'ajoute une entité nombreuses à plusieurs à une entité existante.

Ma structure est simple: p>

  • J'ai une table appelée personne code>, il a un identifiant (primaire, identité) et quelques autres champs de chaîne p> li>

  • une table appelée mot-clé code> avec un identifiant (principale, identité) et un champ de chaîne appelé valeur code> p> p> l>

  • et a personkeywordrelation code>, avec un PersonID code> et un mots-clés mot-clé p> l> li> ul>

    Quand j'ai généré mes entités (base de données d'abord), je reçois une personne personne code>, avec un icollection code> - tout bon, fonctionne comme attendu. p>

    Le problème se pose lorsque j'essaie d'enregistrer une personne code> existante code>, avec une liste modifiée de mots-clés. Seules les propriétés scalaires (chaînes) sont sauvegardées, pas mes mots-clés! p>

    • J'ai essayé de désactiver le chargement paresseux, aucun effet. li>
    • J'ai essayé de charger chaque mot-clé individuel de la base de données, aucun effet. Li>
    • J'ai essayé de charger tous les mots-clés dans le contexte pour voir si cela aiderait à détecter les changements, il n'a pas. Li> ul>

      Je suis à peu près sûr que je ne suis pas le seul à avoir ce problème, (en fait, je suis tout à fait sûr que j'ai vu quelques questions ici déjà, sur le même sujet, mais je suis Impossible de trouver une réponse de travail ...), principalement pour les versions plus anciennes de EF, ce qui est une autre raison de la raison pour laquelle j'ai commencé une autre question: n'a rien changé qui aborde cette question du tout? P>

      ici est mon code qui met la mise à jour (et la création) des personnes. Vous remarquerez ma tentative de fabrication d'EF Enregistrer les modifications en conséquence. P>

          public void SavePersons(IList<Person> persons)
          {
              // Create a EF Context
              using (var ctx = new MyDbEntities())
              {
                  foreach (var person in persons)
                  {
                      // Attach
                      ctx.Persons.Attach(person);
      
                      // Insert or update?
                      ctx.Entry(person).State = person.Id == 0 ? EntityState.Added : EntityState.Modified;
      
                      // Get current keywords before clearing from entity
                      var keywords = new List<Keyword>(person.Keywords);
      
                      // Clear keywords from entity, so we can add fresh ones, hopefully
                      // EF will have an easier time handling this..
                      person.Keywords.Clear();
      
                      // Add keywords
                      keywords.ForEach(kw =>
                      {
                          ctx.Keywords.Attach(kw);
                          ctx.Entry(kw).State = EntityState.Modified;
                          person.Keywords.Add(kw);
                      });            
                  }
      
                  // Save
                  ctx.SaveChanges();
              }
          }
      


2 commentaires

Les valeurs de vos mots-clés changent-elles ou sont-elles la relation entre la personne et les mots-clés changeant ou les deux?


Seule la relation - Cependant, les deux devraient être pris en charge, de préférence.


3 Réponses :


2
votes

Essayez d'ajouter .tolist () : xxx

Je soupçonne que votre liste de mots-clés n'est jamais renseignée car vous le nettoyez avant de l'hydrater.


1 commentaires

Impossible d'utiliser BOLD MARCHUPINE INTÉRIEUR INTÉRIEURE, ASTERISKS supprimé et remplacé par commentaire



1
votes

Ce qui suit est donc non testé mais, après vous corrige mes bugs;) Cela devrait espérer faire le tour. Je ne connais pas le reste de votre code, donc j'ai choisi de créer des clones des données d'entrée et de la fixation des objets au contexte dans un ordre spécifique.

EDIT: Méthode renommée xxx


1 commentaires

Bravo pour le iEnumerable oxygenteshiefs . Tu as fait ma journée! :RÉ



12
votes

Enfin, ... finalement je peux me reposer! J'ai trouvé la solution! Ce n'est pas une jolie, mais ça marche!

Voici le code - le partage est attentionné.

Ceci est définitivement la dernière fois que je travaillerai avec le cadre d'entité. Provoque plus de douleur et d'agonie que bien. xxx


3 commentaires

Cela m'a aidé, alors merci d'avoir posté votre solution. La clé utilisait inclut lors de la récupération de l'entité. J'ai pensé que mon problème avait quelque chose à voir avec le contexte de ne pas suivre la propriété de navigation. Je ne voulais pas désactiver le chargement paresseux car cela m'aurait causé des problèmes lors de la cartographie de l'entité à son Dto.


Il m'a fallu beaucoup de temps pour le comprendre, j'ai posté une réponse à cette question à plusieurs reprises, que je devais ensuite supprimer, car d'autres tests ont révélé des bugs.


Voici une question similaire sur Stackoverflow sur la manière de coder une version générique goo.gl/2Scy