Update-viele-zu-viele-navigation-Eigenschaft in Entity Framework 6, änderungen nicht gespeichert werden

Ich habe mein Haar ziehen für etwa 2 Tage jetzt, da ich das einfach nicht bekommen, EF, um änderungen zu speichern, wenn ich noch eine viele-zu-viele-Entität zu einer vorhandenen Entität.

Meine Struktur ist ganz einfach:

  • Ich habe eine Tabelle namens Person es hat eine ID (Primary identity), und ein paar andere string-Felder

  • Einer Tabelle namens Keyword mit einer ID (Primary identity) und ein string-Feld namens Value

  • und ein PersonKeywordRelation mit PersonId, und ein KeywordId Feld

Wenn ich meine Entitäten generiert (Database first), ich bekomme eine Klasse Person mit einer ICollection<Keyword> - alles gut, funktioniert wie erwartet.

Entsteht das problem, wenn ich versuche zu speichern, eine vorhandene Person mit einer modifizierten Liste von keywords. Nur die skalaren Eigenschaften (strings) gespeichert sind, nicht meine keywords!

  • Ich habe versucht, das deaktivieren Lazy Loading, keine Wirkung.
  • Ich habe versucht, laden Sie jedes einzelne keyword aus der Datenbank wieder, keine Wirkung.
  • Ich habe versucht, laden alle keywords in den Kontext, um zu sehen, ob das helfen würde, EF-Veränderungen erkennen, das ist es nicht.

Ich bin mir ziemlich sicher, ich bin nicht die einzige, die dieses problem auch hatten, (in der Tat bin ich ganz sicher, wie ich gesehen habe ein paar Fragen, die hier schon über das gleiche Thema, doch ich bin nicht in der Lage zu finden, eine funktionierende Antwort...), meist für ältere Versionen von EF, die ist ein weiterer guter Grund, warum ich begonnen habe noch eine andere Frage: Hat sich nichts geändert, der dieses Problem behebt überhaupt?

Hier ist mein code, der für die Aktualisierung (und Erstellung) von Personen. Sie werden bemerken, mein Versuch auf die Herstellung EF speichern Sie die änderungen entsprechend.

    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();
        }
    }
  • Werden die Werte der Schlüsselwörter ändern oder ist die Beziehung zwischen der person und keywords ändern, oder beides?
  • Nur die Beziehung - jedoch sollten beide unterstützt werden, vorzugsweise.
InformationsquelleAutor Jeff | 2013-01-31
Schreibe einen Kommentar