Jak zapisywać obiekty do wielu tabel?

0

Robię aplikację w ASP.NET MVC, używam Dappera, C# itp., chyba to mało istotne i tak.
W warstwie DAL mam klasy odpowiadające tabelom w bazie, tzw. Entites jak np.: ZamowienieEntity, ProduktEntity, KlientEntity itp.

W jednym z kontrolerow mam metode, której flow powinien wyglądać następująco:
"Gdy ktośt robi ogloszenie - jeżeli klient nie istnieje w bazie dodaje go, nastepnie dodaje jego zamowienie oraz produkty jakie zamowil"

Z grubsza w takim flow i podobnym, gdize trzeba zapisywać dane do wielu tabel widzę 2 rozwiązania:

1.)
transakcja
{
Wywoluje po kolei jakis service do sprawdzenia czy klient istnieje juz w bazie, jezeli nie tworze obiekt KlientEntity i wywoluje _klientRepository.Zapisz()
Nastepnie wyznaczam/obliczam produkty jakie zamowil, tworze produty entity i wywoluje _produktyRepository.Zapisz() dla kazdego z nich.
Nastepnie wyliczam zamowienie, robie jakies biznesowe obliczenia etc., jak wszystko bedzie tworze ZamowienieEntity i zapisuje uzywajac kolejnego repo

transakcja.Commit
}

2.)
tworze sobie jakis obiekt dto z polami Klient, Produkty, Zamowienie
wywoluje service do wyznaczenia klienta i uzupelniam nim pole w dto
wywoluje service do wyyznaczenia produktow, uzupelniam nimi pole w dto
wywoluje service do wyznaczanie/obliczenia zamowienia, uzupelniam nim pole w dto

Mając tak wsyzstko wyznaczone/obliczone otwieram transakcje i po kolei wywoluje wszystkie repa i zapisuje co obliczylem:

transakcja
{
_klientRepository.Zapisz(dto.Klient)
_klientRepository.Zapisz(dto.Produkt)
_klientRepository.Zapisz(dto.Zamowienie)

transakcja.Commit
}

Puenta.
Tak naprawde wszystko zmierza do pytania czy powinienem zapisywac poszczegole obiekty sukcesywnie jak je wyliczam, czy pierw wszystko obliczyc/wyznaczyc i na sam koniec po kolei wszystko zapisywac?

2

W prawdziwym świecie nic nie dzieję się synchronicznie - tak bym to ujął.
Czy niepowodzenie dodania zamówienia lub produktu powinno anulować również dodanie klienta do bazy? IMHO Raczej nie.
Transakcje powinny być możliwie krótkie. Więc wszelkie wyliczenia, przygotowanie danych lepiej umieścić poza nimi. Czyli tutaj bardziej podejście drugie jest odpowiednie.

0
CSharpBeginner napisał(a):

W jednym z kontrolerow mam metode, której flow powinien wyglądać następująco:
"Gdy ktośt robi ogloszenie - jeżeli klient nie istnieje w bazie dodaje go, nastepnie dodaje jego zamowienie oraz produkty jakie zamowil"

Takiej metody nie powinno być w kontrolerze lecz w domenie.

tworze sobie jakis obiekt dto z polami Klient, Produkty, Zamowienie
wywoluje service do wyznaczenia klienta i uzupelniam nim pole w dto
wywoluje service do wyyznaczenia produktow, uzupelniam nimi pole w dto
wywoluje service do wyznaczanie/obliczenia zamowienia, uzupelniam nim pole w dto

Taki globalnokontekstowy mutowalny obiekt brzmi jak proszenie się o kłopoty. Prędzej czy później obrośnie jakąś dodatkową ifologią i magicznymi zmianami stanu w nieodpowiednich miejscach.

Mając tak wsyzstko wyznaczone/obliczone otwieram transakcje i po kolei wywoluje wszystkie repa

No tak, bo jak DAO nazwiesz repository, to od razu kod jest lepszy. ;)

Tak naprawde wszystko zmierza do pytania czy powinienem zapisywac poszczegole obiekty sukcesywnie jak je wyliczam, czy pierw wszystko obliczyc/wyznaczyc i na sam koniec po kolei wszystko zapisywac?

Ja bym zapisywał sukcesywnie. Tylko jak @Grzegorz Kotfis ujął, zastanów się, czy to faktycznie powinna być jedna transakcja, bo prawie na pewno nie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1