łatwo mówić w przypadku aplikacji webowej gdzie w jednym zapytaniu możemy pozmieniać wszystkie dane
ale jak to jest w przypadku aplikacji desktopowej, gdzie w jednym miejscu pobierany encję, dajemy użytkownikowi możliwość przykładowo jej edycji i dopiero po kilkunastu minutach może nastąpić część z zapisem?
Ten problem występuje, gdy masz jednowarstwową aplikację i łamiesz SRP używając tych samych obiektów w GUI i w ORM. To może dobre w malutkich, jednorazowych aplikacjach, ale nie gdy tworzymy coś poważnego.
Czy musimy przepisywać encje z entity do jakiegoś innego obiektu a potem na podstawie tego obiektu z powrotem w funkcji zapisu szukać znów tego obiektu na bazie na podstawie jakiegoś ID, po czym przepisać z naszego obiektu do edycji do obiektu bazodanowego entity?
Nie musimy (nikt nas za to nie zbije przecież ;)), ale to dobre rozwiązanie.
W przypadku gdy chcemy dodać możliwość lokalnego tworzenia / usuwania jakichś subelementów, kod może się nieco skomplikować.
Jak to powinno wyglądać?
Mógłbyś podać konkretny przykład, bo chyba nie rozumiem?
Można szukać różnych obejść, jak np. w poście wyżej, ja bym jednak tworzył aplikacje wielowarstwowo, nie łamał SRP i nie pisał aplikacji w sposób niewydajny.
Operowanie na tych samych modelach przy operowaniu na bazie i w GUI jest słabe, bo:
- Ewidentnie łamiemy SRP.
- To, co wyświetlamy w GUI często nie ma związku z tym, co jest w bazie. Zazwyczaj nie potrzebujemy wyświetlać użytkownikowi danych z wszystkich kolumn, więc po co je pobierać? Z drugiej strony często w GUI pokazujemy dane z dwóch obiektów (jak w moim przykładzie). Łączenie obiektów w kodzie GUI jest zazwyczaj trudniejsze, i znacznie mniej wydajne niż zrobienie tego na poziomie najbliższym bazy danych.
- Obiekt między odczytem a zapisem mógł zostać zmieniony przez innego użytkownika. To też trzeba obsłużyć (np. przez optimistic concurrency). Żeby to zrealizować musimy obiekt z bazy i tak pobrać jeszcze raz przed zapisem.
Odczyt z bazy i zapis do bazy wykonumemy w oddzielnych UoW, a obiekty ORM to nie ViewModele. Nieważne, czy to aplikacja webowa, desktopowa, konsolowa czy jakaś jeszcze inna. Ja wiem, że to duża zaleta desktopowych aplikacji, że możemy trzymać obiekty w pamięci, nie to co w web, ale nie wpadajmy w tę pułapkę!
P.S. Obiekt ORM to nie jest encja tylko persistence model. (Entity Framework ma zjebaną nawet nazwę.)