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.
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)MSSQLLocalDB → Databases → FirstEFCoreDatabase →
Tables:
Dvojklikom na tabuľku si zobrazíme jej definíciu, ktorú Entity Framework Core vygeneroval:
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.