Niepokoi mnie również możliwość ewentualnego rozwinięcia się różnic pomiędzy ankietą a egzaminem, a wtedy wiązałoby się to z przebudową tabel i aplikacji.
Przecież różnice będą powstawały niezależnie od tego, który model wybierzesz...
Mam uniwersalną metodę:
public void Load(int id)
{
this.CopyObject(this.operationData.Load(id));
}
gdzie funkcja Load zwraca obiekt biznesowy (zwraca klasę bazową dla obiektów biznesowych) natomiast w metodzie CopyObject następuje mapowanie na faktyczny wynikowy obiekt.
Jedno jest pewne Load
niczego nie zwraca.
W takiej sytuacji w kodzie mam dwa rozwiązania:
1 - Używam jednej klasy "Ankieta" do stworzenia ankiet i egzaminów przez co mam nadmiar funkcji w klasie (chociażby o jedną metodę "VerifyExam()").
2 - W kodzie rozróżniam ankiety i egzaminy, ale wtedy na etapie wczytywania danych nie wiem jaki typ danych zwraca mi klasa Load - muszę wykonać instrukcje warunkowe lub switch, by to sprawdzić. Nie będzie to estetyczne. Dodatkowo powoduje to problemy przy ewentualnych raportach gdzie na jednej liście miałyby być ankiety i egzaminy.
Rozwiązanie 1 nie ma obiektowego sensu, więc nie ma sensu go rozpatrywać.
Rozwiązanie 2 - nie rozumiem problemu. Wczytujesz rekord z tabeli, w zależności od wartości kolumny opisującej typ tworzysz obiekt klasy X albo Y (przez refleksję), i wstawiasz do niego wartości z pozostałych kolumn.
Drugi sposób - niech Twoja metoda będzie generyczna, wtedy od razu będzie wiedziała jaki obiekt utworzyć, a następnie uzupełnisz go wartościami z kolumn dla rekordu o podanym w argumencie ID.
ORM też ma swoje wady i wcale nie jest lekiem na każde zło.
O ile nie potrzebujesz super wydajności czy hurtowego wstawiania ogromnych ilości danych, to owszem, jest!
Na dodatek, użycie ORMa zajęłoby mniej czasu i znaków niż Twój post z pytaniem, a poza tym pozwoliłoby w każdej chwili na zmianę sposobu mapowania, gdybyś stwierdził, że coś Ci w którymś nie pasuje. Nigdy nie warto wynajdować koła na nowo.
Po długich rozmyślaniach podjąłem decyzję, iż zastosuję jednak TPT.
Duże ryzyko wystąpienia pól rozszerzających jest powodem tej decyzji.
Mam nadzieję, że zdajesz sobie sprawę, że ten sposób jest najmniej wydajny.
Rozpoznawać zaś rodzaj ankiety / egzaminu będę po typie zapisanym na bazie - bez użycia instrukcji warunkowych a jedynie przy użyciu refleksji.
Co, jak już pisałem, mógłbyś zrobić też w przypadku TPH.