Entity Framework 4, POCO-Objekte und ASP.Net MVC2. Ich habe viele zu viele Beziehungen, sagen wir zwischen BlogPost- und Tag-Entitäten. Dies bedeutet, dass ich in meiner von T4 generierten POCO BlogPost-Klasse Folgendes habe:
public virtual ICollection<Tag> Tags {
// getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;
Ich fordere einen BlogPost und die zugehörigen Tags von einer Instanz des ObjectContext an und sende ihn an eine andere Ebene (Ansicht in der MVC-Anwendung). Später erhalte ich den aktualisierten BlogPost mit geänderten Eigenschaften und geänderten Beziehungen zurück. Zum Beispiel hatte es die Tags "A", "B" und "C", und die neuen Tags sind "C" und "D". In meinem speziellen Beispiel gibt es keine neuen Tags und die Eigenschaften der Tags ändern sich nie. Das einzige, was gespeichert werden sollte, sind die geänderten Beziehungen. Jetzt muss ich dies in einem anderen ObjectContext speichern. (Update: Jetzt habe ich versucht, in der gleichen Kontextinstanz zu tun und auch fehlgeschlagen.)
Das Problem: Ich kann die Beziehungen nicht richtig speichern. Ich habe alles versucht, was ich gefunden habe:
- Controller.UpdateModel und Controller.TryUpdateModel funktionieren nicht.
- Es funktioniert nicht, den alten BlogPost aus dem Kontext zu holen und dann die Sammlung zu ändern. (mit verschiedenen Methoden ab dem nächsten Punkt)
- Dies würde wahrscheinlich funktionieren, aber ich hoffe, dies ist nur eine Problemumgehung, nicht die Lösung :(.
- Versucht, Attach / Add / ChangeObjectState-Funktionen für BlogPost und / oder Tags in allen möglichen Kombinationen. Gescheitert.
- Das sieht so aus, wie ich es brauche, aber es funktioniert nicht (ich habe versucht, es zu beheben, kann es aber nicht für mein Problem).
- Versucht ChangeState / Add / Attach / ... die Beziehungsobjekte des Kontexts. Gescheitert.
"Funktioniert nicht" bedeutet in den meisten Fällen, dass ich an der angegebenen "Lösung" gearbeitet habe, bis sie keine Fehler mehr erzeugt und zumindest die Eigenschaften von BlogPost speichert. Was mit den Beziehungen passiert, ist unterschiedlich: Normalerweise werden Tags erneut mit neuen PKs zur Tag-Tabelle hinzugefügt, und der gespeicherte BlogPost verweist auf diese und nicht auf die ursprünglichen. Natürlich haben die zurückgegebenen Tags PKs, und vor den Speicher- / Aktualisierungsmethoden überprüfe ich die PKs und sie entsprechen denen in der Datenbank, sodass EF wahrscheinlich denkt, dass es sich um neue Objekte handelt und diese PKs die temporären sind.
Ein Problem, das ich kenne und das es möglicherweise unmöglich macht, eine automatisierte einfache Lösung zu finden: Wenn die Sammlung eines POCO-Objekts geändert wird, sollte dies durch die oben erwähnte Eigenschaft der virtuellen Sammlung geschehen, da der Trick FixCollection die umgekehrten Verweise am anderen Ende aktualisiert der Viele-zu-Viele-Beziehung. Wenn eine Ansicht jedoch ein aktualisiertes BlogPost-Objekt "zurückgibt", ist dies nicht geschehen. Dies bedeutet, dass es vielleicht keine einfache Lösung für mein Problem gibt, aber das würde mich sehr traurig machen und ich würde den EF4-POCO-MVC-Triumph hassen :(. Auch das würde bedeuten, dass EF dies in der MVC-Umgebung überhaupt nicht tun kann Es werden EF4-Objekttypen verwendet :(. Ich denke, die auf Snapshots basierende Änderungsverfolgung sollte herausfinden, dass der geänderte BlogPost Beziehungen zu Tags mit vorhandenen PKs hat.
Übrigens: Ich denke, das gleiche Problem tritt bei Eins-zu-Viele-Beziehungen auf (Google und mein Kollege sagen es). Ich werde es zu Hause versuchen, aber selbst wenn das funktioniert, hilft mir das in meinen sechs vielen-zu-vielen-Beziehungen in meiner App nicht weiter :(.