Entity Framework 4, obiekty POCO i ASP.Net MVC2. Mam wiele relacji, powiedzmy między podmiotami BlogPost i Tag. Oznacza to, że w mojej wygenerowanej przez T4 klasie POCO BlogPost mam:
public virtual ICollection<Tag> Tags {
// getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;
Proszę o BlogPost i powiązane Tagi z instancji ObjectContext i wysyłam je do innej warstwy (Widok w aplikacji MVC). Później otrzymuję zaktualizowany BlogPost ze zmienionymi właściwościami i zmienionymi relacjami. Na przykład miał tagi „A”, „B” i „C”, a nowe tagi to „C” i „D”. W moim przykładzie nie ma nowych tagów, a właściwości tagów nigdy się nie zmieniają, więc jedyną rzeczą, którą należy zapisać, są zmienione relacje. Teraz muszę zapisać to w innym ObjectContext. (Aktualizacja: teraz próbowałem to zrobić w tej samej instancji kontekstowej i również się nie udało).
Problem: nie mogę sprawić, żeby to właściwie uratowało relacje. Próbowałem wszystkiego, co znalazłem:
- Controller.UpdateModel i Controller.TryUpdateModel nie działają.
- Pobieranie starego BlogPost z kontekstu, a następnie modyfikowanie kolekcji nie działa. (różnymi metodami od następnego punktu)
- To prawdopodobnie zadziała, ale mam nadzieję, że to tylko obejście, a nie rozwiązanie :(.
- Wypróbowano funkcje Attach / Add / ChangeObjectState dla BlogPost i / lub Tagi we wszystkich możliwych kombinacjach. Niepowodzenie.
- To wygląda co muszę, ale to nie działa (próbowałem to naprawić, ale nie mogę do mojego problemu).
- Wypróbowano ChangeState / Add / Attach / ... obiekty relacji kontekstu. Niepowodzenie.
„Nie działa” oznacza w większości przypadków, że pracowałem nad danym „rozwiązaniem”, dopóki nie wygeneruje ono żadnych błędów i nie zapisze przynajmniej właściwości BlogPosta. To, co dzieje się z relacjami, jest różne: zwykle Tagi są ponownie dodawane do tabeli Tagów z nowymi PK, a zapisany BlogPost odwołuje się do nich, a nie do oryginalnych. Oczywiście zwrócone tagi mają PK, a przed metodami save / update sprawdzam PK i są one równe tym w bazie danych, więc prawdopodobnie EF myśli, że są to nowe obiekty, a te PK to tymczasowe.
Problem, o którym wiem i może uniemożliwić znalezienie zautomatyzowanego prostego rozwiązania: Kiedy kolekcja obiektu POCO zostanie zmieniona, powinno to nastąpić przez wspomnianą powyżej właściwość kolekcji wirtualnej, ponieważ wtedy sztuczka FixupCollection zaktualizuje odwrotne odwołania na drugim końcu relacji wiele-do-wielu. Jednak gdy widok „zwraca” zaktualizowany obiekt BlogPost, tak się nie stało. Oznacza to, że może nie ma prostego rozwiązania mojego problemu, ale to by mnie bardzo zasmuciło i nienawidziłbym triumfu EF4-POCO-MVC :(. To również oznaczałoby, że EF nie może tego zrobić w środowisku MVC cokolwiek Używane są typy obiektów EF4 :(. Myślę, że śledzenie zmian oparte na migawkach powinno wykryć, że zmieniony BlogPost ma powiązania z tagami z istniejącymi PK.
Btw: Myślę, że ten sam problem występuje w relacjach jeden do wielu (Google i mój kolega tak twierdzą). Spróbuję w domu, ale nawet jeśli to zadziała, nie pomoże mi to w moich sześciu relacjach wiele do wielu w mojej aplikacji :(.