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 namensValue
-
und ein
PersonKeywordRelation
mitPersonId
, und einKeywordId
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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Endlich.. Endlich kann ich Ruhe! Ich habe die Lösung gefunden! Es ist kein schönes, aber es funktioniert!
Hier ist das code - sharing ist fürsorglich.
Dies ist definitiv das Letzte mal, ich werde die Arbeit mit Entity Framework. Verursacht mehr Schmerzen & agony als gut.
Includes
beim abrufen der Entität. Ich dachte, mein problem etwas damit zu tun hatte den Kontext nicht die Verfolgung der navigation-Eigenschaft. Ich wollte nicht zu deaktivieren, lazy loading, da würde es verursacht mir Probleme bei der Zuordnung der Person zu seiner DTO.Versuchen Sie,.ToList():
Ich bin zu Ahnen, dass Ihre Keywords-Liste ist nie aufgefüllt weil Sie es deaktivieren, bevor feuchtigkeitsspendende es.
Also Folgendes ist ungetestet, aber nach Sie fix mein Fehler 😉 es sollte hoffentlich den trick tun. ich weiß nicht, den rest des Codes, so dass ich entschieden habe erstellen Klone der Eingabe-Daten und die Befestigung der Objekte auf den Kontext, in einer bestimmten Reihenfolge.
EDIT: umbenannt Methode
IEnumerable<Person> oxygenThiefs
. You made my day! 😀