Skip to content

Commit

Permalink
Merge pull request #80 from bmeviauac01/hf2024
Browse files Browse the repository at this point in the history
2024 HF1 HF2 description update
  • Loading branch information
tibitoth authored Aug 23, 2024
2 parents 739a51a + 0083328 commit b918496
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 13 deletions.
34 changes: 30 additions & 4 deletions docs/hu/homework/ef/index.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Feladat: Entity Framework

A házi feladat opcionális. A teljesítéssel **2 pluszpont és 2 iMsc pont** szerezhető.
A házi feladat teljesítésével **4 pont és 2 iMsc pont** szerezhető.

GitHub Classroom segítségével hozz létre magadnak egy repository-t. A **meghívó URL-t Moodle-ben találod**. Klónozd le az így elkészült repository-t. Ez tartalmazni fogja a megoldás elvárt szerkezetét. A feladatok elkészítése után kommitold és pushold a megoldásod.

Expand All @@ -13,7 +13,7 @@ A megoldáshoz szükséges szoftvereket és eszközöket lásd [itt](../index.md

Első lépésként a gyökérben található `neptun.txt` fájlba írd bele a Neptun kódodat!

## Feladat 1: Adatbázis leképzés Code First modellel és lekérdezések (2 pluszpont)
## Feladat 1: Adatbázis leképzés Code First modellel és lekérdezések (2 pont)

Készítsd el az adatbázisunk (egy részének) Entity Framework leképzését _Code First_ megoldással. Az Entity Framework Core csomag már része a kiinduló projektünknek, így rögtön kódolhatunk is. Az adatelérés központi eleme a DbContext. Ez az osztály már létezik `ProductDbContext` néven.

Expand Down Expand Up @@ -68,10 +68,10 @@ A teszteléshez találsz unit teszteket a solution-ben. A tesztek kódja ki van

A képernyőképen levő forráskód tekintetében nem szükséges, hogy a végső megoldásban szereplő kód betűről betűre megegyezzen a képen és a feltöltött változatban. Tehát a tesztek sikeres lefutása után elkészített képernyőképet nem szükséges frissíteni, ha a forráskódban **kisebb** változtatást eszközölsz.

## Feladat 2: Repository megvalósítás Entity Framework-kel (2 iMsc pont)
## Feladat 2: Repository megvalósítás Entity Framework-kel (2 pont)

!!! note ""
Az iMsc pont megszerzésére az első feladat megoldásával együtt van lehetőség.
A pont megszerzésére az első feladat megoldásával együtt van lehetőség.

Az Entity Framework DbContext-je az előzőekben megírt módon nem használható kényelmesen. Például a kapcsolatok betöltését (`Include`) kézzel kell kezdeményezni, és a leképzett entitások túlságosan kötődnek az adatbázis sémájához. Egy komplex alkalmazás esetében ezért célszerű a DbContext-et a repository minta szerint becsomagolni, és ily módon nyújtani az adatelérési réteget.

Expand All @@ -87,3 +87,29 @@ Implementáld a `ProductRepository` osztály függvényeit.

!!! example "BEADANDÓ"
A módosított C# forráskódot töltsd fel.

## Feladat 3: Logikai törlés Entity Framework-kel (2 iMSc pont)

!!! note ""
A pont megszerzésére az első két feladat megoldásával együtt van lehetőség.

Az adatbázisból való törlés egy olyan művelet, ami számos nemkívánt hatással rendelkezik. Egy törölt adatot visszaállítani sokkal nehezebb, néha nem is lehetséges következmények nélkül. Az adat törlésével akár a teljes adattörténet elveszhet, nem tudunk a törlés előtti állapotról, különböző statisztikákban nem tudjuk felhasználni. Ráadásul előfordulnak olyan esetek, például amikor olyan más táblákkal való kapcsolatok és külső kulcs kényszerek vannak, hogy a törlés kihatással van azokra a táblákra is.

Ezen problémák áthidalására a leggyakoribb megoldás, hogy egy nem végleges törlést, hanem egy úgynevezett logikai törlést (soft delete) vezetünk be. Ebben az esetben egy mező (tipikusan `IsDeleted` névvel) átállításával jelezzük, hogy az adott adat már törölve van. Így az megmarad az adatbázisban is, de tudjuk szűrni, hogy töröltek-e.

A szűrés naiv implementációja azonban nem kényelmes. Képzeljük el, hogy minden lekérdezés vagy mentés esetén oda kell írni a kifejezésbe, hogy ne hasson ezekre a törölt elemekre.
Ennek érdekében az Entity Framework egyik funkcióját érdemes kihasználni, a *Global Query Filter*-t. Ennek a segítségével olyan szűrőfeltételeket határozhatunk meg, amiket globálisan, minden egyes lekérdezésnél automatikusan alkalmaz az Entity Framework.

Implementáld a logikai törlést az előbbiekben elkészített `DbProduct` osztályhoz (több megoldási lehetőség is van, tetszőlegesen választhatod bármelyiket):

!!! important "Módosíthatóság"
Bár az előző feladatban volt megkötés, hogy ne legyen az `OnConfiguring` függvény felüldefiniálva, amennyiben szükségesnek látod, itt nyugodtan lehet (illetve más függvényeket is felüldefiniálhatsz a DBContext megvalósításban)!

1. Vegyél fel egy `IsDeleted` változót, ami jelzi az alkalmazásunk számára, hogy az adott entitás törölt állapotban van!

1. Vegyél fel egy *QueryFilter*-t, ami minden lekérdezéskor kiszűri azokat a termékeket, amiket már töröltünk, így azokat nem kapjuk vissza!

1. Az adatbázisból való törlés viselkedését változtasd meg **általánosan** a `DbContext` mentés műveleteit kibővítve (erre több kiterjesztési pontot is nyújt az EFCore), hogy az igazi törlés helyett csak átváltoztassa az `IsDeleted` változót! Ne változtasd meg a törlés műveletet a repositoryban módosításra!

!!! example "BEADANDÓ"
A módosított C# forráskódot töltsd fel.
1 change: 0 additions & 1 deletion docs/hu/homework/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ A házi feladatok **opcionálisak, pluszpont és iMsc pont** szerezhető velük.
## A feladatok

1. [MSSQL szerveroldali programozás](mssql/index.md)
1. [ADO.NET adatelérés](adonet/index.md)
1. [Entity Framework](ef/index.md)
1. [MongoDB](mongodb/index.md)
1. [REST API Web API technológiával](rest/index.md)
Expand Down
31 changes: 24 additions & 7 deletions docs/hu/homework/mssql/index.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Feladat: MSSQL szerveroldali programozás

A házi feladat opcionális. A teljesítéssel **2 pluszpont és 2 iMsc pont** szerezhető.
A házi feladat opcionális. A teljesítéssel **4 pont és 2 iMsc pont** szerezhető.

GitHub Classroom segítségével hozz létre magadnak egy repository-t. A **meghívó URL-t Moodle-ben találod**. Klónozd le az így elkészült repository-t. Ez tartalmazni fogja a megoldás elvárt szerkezetét. A feladatok elkészítése után kommitold és pushold a megoldásod.

Expand All @@ -17,25 +17,42 @@ Hozz létre egy új adatbázist, amelynek **neve megegyezik a Neptun kódoddal**

Első lépésként a gyökérben található `neptun.txt` fájlba írd bele a Neptun kódodat!

## Feladat 1: Jelszó lejárat és karbantartása (2 pluszpont)
## Feladat 1: Jelszó lejárat és karbantartása (2 pont)

Biztonsági megfontolásból szeretnénk kötelezővé tenni a jelszó időnkénti megújítását. Ehhez rögzíteni fogjuk, és karbantartjuk a jelszó utolsó módosításának idejét.

1. Adj hozzá egy új oszlopot a `Customer` táblához `PasswordExpiry` néven, ami egy dátumot tartalmaz: `alter table [Customer] add [PasswordExpiry] datetime`.

1. Készíts egy triggert, amellyel jelszó változtatás esetén automatikusan kitöltésre kerül a `PasswordExpiry` mező értéke. Az új értéke a mai dátum plusz egy év legyen. Az értéket a szerver számítsa ki. Ügyelj arra, hogy új vevő regisztrálásakor (_insert_) mindig kitöltésre kerüljön a mező, viszont a vevő adatainak szerkesztésekor (_update_) csak akkor változzon a lejárat dátuma, ha változott a jelszó. (Tehát pl. ha az email címet változtatták csak, akkor a lejárat ne változzon.) A trigger csak a beszúrt/frissített rekorddal törődjön (tehát nem a tábla teljes tartalmára kell frissíteni a dátum oszlopot)! A feladatban készülnöd kell arra is, hogy egyszerre több rekord módosul.

Ellenőrizd a trigger viselkedését különböző esetekre is.
Ellenőrizd a trigger viselkedését különböző esetekre is!

!!! example "BEADANDÓ"
A trigger kódját az `f1.sql` fájlban add be. Az sql fájl egyetlen utasítást tartalmazzon csak (egyetlen `create trigger`), ne legyen benne se `use` se `go` parancs!

Készíts egy képernyőképet a `Customer` tábla tartalmáról, amiben látható az új oszlop és annak kitöltött értékei (a tesztelés utáni állapottal). A képen legyen látható az adatbázisod neve (a Neptun kódod). A képet `f1.png` néven mentsd el és add be a megoldásod részeként!

## Feladat 2: Termék ajánlott korhatára (2 iMsc pont)
## Feladat 2: Számla érvénytelenítése (2 pont)

Szeretnénk lehetőséget biztosítani rendelések lemondására is egy tárolt eljárás segítségével. Az eljárás a vevő nevével és a rendelés azonosítójával rendelkező számlát fogja érvényteleníteni, majd a hozzá tartozó rendelés tételein végigmenve visszaállítja a raktárkészletet.

1. Hozz létre egy tárolt eljárást `cancel_invoice` mely két paramétert fogad: a vevő nevét `name` néven, és a megrendelés azonosítóját `orderId` néven.

2. A tárolt eljárás ellenőrizze le, hogy van-e a megadott adatokkal számla, ha nincs, dobjon kivételt. A kivétel `error_number` értéke legyen 51000.

3. Ha az adatok jók, akkor a tárolt eljárás vegye az összes számlán szereplő terméket, nézze meg, hogy mennyit vettek belőlük, és a megrendelt mennyiséget adja hozzá a raktárkészlethez. (TIPP: az adatok összeszedéséhez több tábla, esetleg kurzor is kellhet).

Ellenőrizd az eljárás működését!

!!! example "BEADANDÓ"
A trigger kódját az `f2.sql` fájlban add be. Az sql fájl egyetlen utasítást tartalmazzon csak (egyetlen `create procedure cancel_invoice`), ne legyen benne se `use` se `go` parancs!

Készíts egy képernyőképet amin látható a tárolt eljárás lefutása és annak hatása, illetve mi történik, ha hibás adatokat adunk meg (lehet egy ablakban két tabbal például). A képen legyen látható az adatbázisod neve (a Neptun kódod). A képet `f2.png` néven mentsd el és add be a megoldásod részeként!

## Feladat 3: Termék ajánlott korhatára (2 iMsc pont)

!!! note ""
Az iMsc pont megszerzésére az első feladat megoldásával együtt van lehetőség.
Az iMsc pont megszerzésére az első két feladat megoldásával együtt van lehetőség.

A minta adatbázisban a termékek (`Product`) rekordjaiban van egy xml típusú `Description` nevű oszlop. Ez néhány terméknél van csak kitöltve.

Expand All @@ -61,6 +78,6 @@ Szeretnénk a `recommended_age` tag tartalmát könnyebb elérhetőség végett
1. Írj T-SQL szkriptet, amely minden termék esetén az xml leírásból az `<recommended_age>` elemet kiemelve feltölti az előbb létrehozott `RecommendedAge` oszlopot. Ha az xml leírás üres, vagy nincs benne a keresett elem, akkor maradjon `NULL` az új oszlop tartalma. Ellenkező esetben az xml tag szöveges tartalma kerüljön átmásolásra, és az xml dokumentumból töröld ezt az elemet. Feltételezheted, hogy csak egyetlen `<recommended_age>` elem van az xml-ben.

!!! example "BEADANDÓ"
A scriptet az `f2.sql` fájlban add be. Ne használj se tárolt eljárást, se triggert, csak egy T-SQL kód blokkot készíts. Az sql fájl önmagában futtatható legyen, ne legyen benne se `use` se `go` parancs!
A scriptet az `f3.sql` fájlban add be. Ne használj se tárolt eljárást, se triggert, csak egy T-SQL kód blokkot készíts. Az sql fájl önmagában futtatható legyen, ne legyen benne se `use` se `go` parancs!

Készíts egy képernyőképet a `Product` tábla tartalmáról a kitöltés után. Legyen látható az új oszlop és annak tartalma. A képen legyen látható az adatbázisod neve (a Neptun kódod). A képet `f2.png` néven mentsd el és add be a megoldásod részeként!
Készíts egy képernyőképet a `Product` tábla tartalmáról a kitöltés után. Legyen látható az új oszlop és annak tartalma. A képen legyen látható az adatbázisod neve (a Neptun kódod). A képet `f3.png` néven mentsd el és add be a megoldásod részeként!
1 change: 0 additions & 1 deletion mkdocs.hu.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ nav:
- "Házi feladatok":
- homework/index.md
- homework/mssql/index.md
- homework/adonet/index.md
- homework/ef/index.md
- homework/mongodb/index.md
- homework/rest/index.md
Expand Down

0 comments on commit b918496

Please sign in to comment.