Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

3. diel - Generovanie databázy v Entity Framework Core a C# .NET

V minulej lekcii, Inštalácia a prvý model v Entity Framework Core a C# .NET , sme si založili náš prvý projekt s Entity Framework Core a vytvorili jednoduchý model.

V dnešnom Entity Framework Core tutoriále, v jazyku C#.NET, si necháme vygenerovať databázu z nášho prvého modelu.

Ako už bolo niekoľkokrát povedané, na komunikáciu s databázou budeme v Entity Framework Core využívať inštanciu databázového kontextu. Než si ale takú inštanciu vytvoríme, tak si povieme niečo málo o jej životnosti.

Životnosť databázového kontextu

Životnosť inštancie databázového kontextu začína vo chvíli jej vytvorenia a končí, keď je na ňu zavolaná metóda Dispose(). Táto metóda ukončí spojenie s databázou a odoberie inštanciu všetky zdroje. Inštancie databázového kontextu sú určené na použitie na jednu tzv. jednotku práce.

Nepoužívame teda jednu inštanciu databázového kontextu počas životnosti celej aplikácie.

Pod jednotkou práce si môžeme predstaviť jednoduchú a nedeliteľnú operáciu nad databázou. V redakčnom systéme by to napríklad mohlo byť:

  • získanie všetkých článkov konkrétneho autora z databázy,
  • vloženie nového článku,
  • vloženie viacerých nových kategórií článkov naraz,
  • zmazanie všetkých článkov bez autora alebo
  • zmena kategórií článku, kedy niektoré mu odoberieme a iné naopak pridáme.
Životnosť inštancie databázového kontextu je zvyčajne veľmi krátka. V prípade webových ASP.NET Core aplikácií je životnosť inštancie typicky určená dobou nutnou pre vybavenie jednej HTTP požiadavky zaslanej na náš server.

Generovanie databázy

Vygenerovať databázu z nášho modelu môžeme dvoma spôsobmi. Buď pomocou systému tzv. migráciou, alebo pomocou metódy EnsureCreated(). Migrácie nám umožňujú jednoducho aplikovať zmeny modelu na databázu bez toho, aby sme prišli o uložené dáta. Ide o najčastejší spôsob generovania databázy v Entity Framework Core. Na migráciu sa však zameriame až v budúcich lekciách. V dnešnej lekcii použijeme metódu EnsureCreated().

Metóda EnsureCreated()

Ako názov napovedá, metóda EnsureCreated() dokáže zaistiť, že je databáza vytvorená. V prípade, že v čase jej zavolania nie je vytvorená, tak ju automaticky vygeneruje z modelu. Ak databáza už existuje, tak metóda nič nevykoná, a to aj v prípade, keď sa jej štruktúra líši od nášho modelu. Nedokáže teda zaistiť synchronizáciu štruktúry databázy s naším modelom. Preto sa často používa v kombinácii s metódou EnsureDeleted(), pomocou ktorej pred zavolaním metódy EnsureCreated() najprv vymažeme celú databázu.

Generovanie databázy s použitím kombinácie týchto dvoch metód sa využíva v situáciách, kedy nám nezíde na zachovanie dát uložených v databáze. Najčastejšie je to pri prototypovaní, testovaní alebo pre lokálnu cache.

Metódu EnsureCreated() nemožno použiť v kombinácii s migráciami.

Vygenerovanie našej databázy

Teraz sa v našom projekte presunieme do súboru Program.cs. Tu si vytvoríme inštanciu databázového kontextu FirstDbContext a použijeme ju na vygenerovanie našej databázy:

Na vygenerovanie databázy používame metódu EnsureCreated(). Tú nenájdeme priamo v databázovom kontexte, ale na inštancii triedy DatabasaFacade, ktorá je uložená vo vlastnosti Database databázového kontextu. V prípade vygenerovania databázy vracia metóda EnsureCreated() hodnotu true, na ktorú reagujeme vypísaním hlášky do konzoly. V opačnom prípade metóda vracia hodnotu false.

Po dokončení práce s kontextom nesmieme zabudnúť ukončiť spojenie a uvoľniť zdroje zavolaním metódy Dispose().

Blok using

Metóda Dispose() pochádza z rozhrania IDisposable, ktoré databázový kontext implementuje. Toto rozhranie implementujú triedy, ktorých inštancie potrebujú po vykonaní svojej práce vykonať po sebe upratovanie. Jazyk C# ponúka pre toto rozhranie špeciálnu syntax v podobe bloku using, ktorý zaistí automatické zavolanie metódy Dispose() na svojom konci.

Prepíšme pred chvíľou napísaný kód tak, aby využíval blok using:

Spustenie programu

Databázu vygenerujeme spustením programu. Do konzoly sa nám vypíše očakávaná hláška:

Pri každom ďalšom spustení aktuálneho programu sa hláška už nevypíše. Databáza bude totiž už vygenerovaná.

Zobrazenie databázy

Na vygenerovanú LocalDB sa vo Visual Studio pozrieme cez nástroj SQL Server Object Explorer. V hornej ponuke Visual Studio klikneme na View a zvolíme SQL Server Object Explorer. K tabuľke Authors našej databázy sa postupne preklikáme cez SQL Server → (localdb)MSSQLLo­calDB → Databases → FirstEFCoreDatabase → Tables:

SQL Sever Object Explorer - Entity Framework Core v C# .NET

Dvojklikom na tabuľku si zobrazíme jej definíciu, ktorú Entity Framework Core vygeneroval:

Definícia tabuľky Authors - Entity Framework Core v C# .NET

V SQL kóde si môžeme všimnúť, že stĺpec Id bol vďaka atribútu [Key] vlastnosti Id skutočne nastavený ako primárny kľúč tabuľky a že mu navyše bola nastavená aj vlastnosť IDENTITY. Táto vlastnosť nám zaistí automatické číslovanie všetkých záznamov a nebudeme tak musieť zadávať Id autorov. V skutočnosti vlastnosť Id nebudeme môcť nastaviť na nič iné ako na východiskovú hodnotu dátového typu int, teda 0.

Zmazanie databázy

Ako už bolo spomenuté vyššie, metóda EnsureCreated() sa často používa v kombinácii s metódou EnsureDeleted(), kedy si na začiatku programu najskôr metódou EnsureDeleted() zmažeme celú databázu a hneď nato ju znovu vygenerujeme metódou EnsureCreated(). Urobíme tak aj my, aby sme pri našom prototypovaní vždy pracovali s čistou databázou:

V prípade zmazania existujúcej databázy metóda EnsureDeleted() vracia hodnotu true, na ktorú reagujeme vypísaním hlášky do konzoly. V opačnom prípade metóda vracia hodnotu false.

Po každom spustení aktuálneho programu uvidíme tento výstup:

Tým pre dnešnú lekciu skončíme.

V budúcej lekcii, Prvé otázky na databázu v Entity Framework Core a C# .NET , si ukážeme prvé otázky na vkladanie a výber záznamov z databázy. Zmienime sa taktiež o dôležitom koncepte sledovania zmien.


 

Predchádzajúci článok
Inštalácia a prvý model v Entity Framework Core a C# .NET
Všetky články v sekcii
Entity Framework Core v C# .NET
Preskočiť článok
(neodporúčame)
Prvé otázky na databázu v Entity Framework Core a C# .NET
Článok pre vás napísal Radek Vymětalík
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
...
Aktivity