2. diel - Inštalácia a prvý model v Entity Framework Core a C# .NET
V minulej lekcii, Úvod do Entity Framework Core v C# .NET , sme si uviedli a porovnali rôzne spôsoby práce s relačnými databázami v C# .NET.
V dnešnom Entity Framework Core tutoriále, v jazyku C# .NET, si pripravíme Visual Studio a založíme náš prvý projekt s Entity Framework Core, ktorý si nainštalujeme. Nakoniec ešte začneme pracovať na tvorbe jednoduchého modelu.
V našom prvom projekte budeme používať odľahčenú verziu Microsoft SQL Server databázy označovanú LocalDB. Táto databáza sa najčastejšie používa buď pri vývoji aplikácie, a vo finálnej verzii je nahradená, alebo niekedy aj ako lokálne úložisko dát.
V druhom prípade sa však skôr volí databáza SQLite.
Príprava LocalDB
LocalDB je možné si nainštalovať cez Visual Studio Installer, a to buď v rámci sady funkcií Ukladanie a spracovanie dát (Data storage and processing), alebo Vývoj pre ASP.NET a web (ASP.NET and web development).
Ak niektorú z týchto sád máme nainštalovanú, si overíme vo Visual Studio Installer kliknutím na Zmeniť u nami používanej verzie Visual Studia. Uistíme sa, že máme zaškrtnutú aspoň jednu z týchto sád, prípadne niektorú zaškrtneme a zmeny potvrdíme:
Alternatívne môžeme LocalDB nainštalovať len ako samostatný komponent SQL Server Express 2019 LocalDB v zodpovedajúcej záložke Jednotlivé komponenty:
Kurz je písaný s použitím Visual Studio 2022.
Database First a Code First prístup
V lekcii Úvod do Entity Framework Core v C# .NET sme si už povedali, že na to, aby sme v Entity Framework Core mohli komunikovať s SQL databázou, potrebujeme tzv. model. Modelom chápeme popis štruktúry databázy vo forme C# tried. Tento popis sa skladá najmä z jednotlivých entít a databázového kontextu.
V Entity Framework Core môžeme zvoliť jeden z dvoch prístupov, ako takýto model vytvoriť. Konkrétne sa jedná o prístupy Database First a Code First.
Database First
Prístup Database First predpokladá, že sa chceme pripojiť k už existujúcej SQL databáze. Všetky triedy nášho modelu tak musíme prispôsobiť tabuľkám danej databázy, aby presne kopírovali ich štruktúru. Aj keď Entity Framework Core našťastie ponúka nástroje, ktoré dokážu z SQL databázy automaticky vygenerovať model úplne za nás, tak tento prístup v dnešnej dobe už nie je úplne populárny. Pre tvorbu aj tej najjednoduchšej databázy od nás totiž vyžaduje písanie SQL príkazov.
Code First
Oveľa populárnejší je opačný prístup, prístup Code First, kedy najskôr napíšeme náš model a následne si z neho necháme automaticky vygenerovať celú databázu. Pri tvorbe aplikácie tak nemusíme prechádzať medzi dvoma rôznymi jazykmi, všetko píšeme iba v jazyku C#, a vyhneme sa tak množstvu chýb z nepozornosti. Entity Framework Core dokonca ponúka prostriedky na jednoduchú a bezpečnú aktualizáciu databázy po zmene definície modelu.
My pre náš projekt zvolíme práve prístup Code First. Prvé si teda napíšeme triedy pre entity a databázový kontext a databázu si z nich potom necháme vygenerovať.
Založenie projektu
Teraz sa už môžeme vrhnúť na tvorbu nášho prvého projektu. Celý kurz sa bude venovať predovšetkým tvorbe databázy a komunikácii s ňou, nebudeme sa tak zaoberať tvorbou nejakého sofistikovaného užívateľského rozhrania. Entity Framework Core našťastie nie je viazaný na jeden konkrétny typ projektu, preto budú všetky naše projekty v tomto kurze jednoduché konzolové aplikácie.
V prípade, že by vás zaujímalo, ako Entity Framework Core zapracovať do ASP.NET Core projektu, tak môžete po absolvovaní tohto kurzu navštíviť zodpovedajúcu sekciu ASP.NET Core - Webové aplikácie v C#, kde ho používame takmer v každom kurze.
Otvoríme si teda Visual Studio a vytvoríme novú C# .NET konzolovú
aplikáciu, ktorú si pomenujeme napríklad FirstEFCoreProject
:
Verziu frameworku zvolíme ideálne tú najnovšiu, v našom prípade .NET 7:
Inštalácia Entity Framework Core
Entity Framework Core sa do C# .NET projektov inštaluje prostredníctvom
NuGet balíčkov. Týchto balíčkov máme k dispozícii viac podľa
poskytovateľov databáz. My využijeme balík
Microsoft.EntityFrameworkCore.SqlServer
určený pre Microsoft SQL
Server databázy.
V okne Solution Explorer teda klikneme pravým tlačidlom na
Solution a zvolíme Manage NuGet Packages for Solution.... V
záložke Browse si vyhľadáme a vyberieme balíček
Microsoft.EntityFrameworkCore.SqlServer
. Potom v menu napravo
zaškrtneme náš jediný projekt a vyberieme najnovšiu dostupnú verziu
balíčka pre .NET, v ktorom aplikáciu vyvíjame.
Ak vyvíjame napríklad v .NET 7, tak
balíčky nainštalujeme vo verzii 7.xy
, kde x
a
y
sú najväčšie možné čísla.
Inštaláciu potvrdíme tlačidlom Install:
Tým máme náš projekt pripravený a môžeme sa dať na písanie kódu.
Entita Author
V našom prvom projekte budeme mať iba jednu entitu, a to entitu
Author
predstavujúcu autora článkov v redakčnom systéme.
Entita bude mať vlastnosti:
Id
- unikátny identifikátor autora,Name
- meno,LastName
- priezvisko,BirthDate
- dátum narodenia,ArticlesCount
- počet napísaných článkov.
Author
s vyššie uvedenými
vlastnosťami:
Od Visual
Studio 2022 sú všetky projekty automaticky generované s povolenou funkciou
nullovateľných referenčných typov (funkcia pridaná v C#
8.0). Táto funkcia nám umožňuje nastaviť hodnotu null
iba
atribútom alebo vlastnostiam, ktoré majú definíciu typu označenú
operátorom ?
, a to aj v prípade, že sa jedná o
referenčný dátový typ. Každý atribút alebo vlastnosť
referenčného dátového typu tak musí mať pri vytváraní objektu nastavenú
nejakú východiskovú hodnotu inú ako null
, pokiaľ nie je
označený ako nullovateľný operátorom ?
. Preto našim
vlastnostiam nastavujeme ako predvolenú hodnotu prázdny reťazec.
Vlastnosť Id
sme anotovali atribútom [Key]
z
menného priestoru System.ComponentModel.DataAnnotations
. Týmto
atribútom hovoríme, že zodpovedajúci stĺpec v databáze sa vygeneruje s
primárnym kľúčom. Každý záznam tak bude môcť v tomto
stĺpci obsahovať iba unikátne hodnoty a bude vďaka tomu týmto stĺpcom
jednoznačne identifikovateľný. V predvolenom nastavení musia mať všetky
entity v Entity Framework Core svoj primárny kľúč.
Databázový kontext
Databázu nám bude spolu s entitou Author
popisovať
databázový kontext. Databázovým kontextom je akýkoľvek potomok triedy
DbContext
.
V databázovom kontexte definujeme pripojenie k databáze, aké tabuľky má databáza obsahovať, vzťahy medzi týmito tabuľkami a mnohé ďalšie. Inštancia databázového kontextu predstavuje spojenie s databázou, ktoré je možné použiť na dopytovanie a ukladanie dát do databázy.
Naším databázovým kontextom bude trieda FirstDbContext
,
ktorú si pridáme do projektu:
Triedu sme zdedili od
spomínanej triedy DbContext
, ktorú nájdeme v mennom priestore
Microsoft.EntityFrameworkCore
.
Tabuľky
Jednotlivé tabuľky databázy reprezentujeme v databázovom kontexte
vlastnosťami typu DbSet<T>
. Pridajme si do nášho
databázového kontextu vlastnosť Authors
typu
DbSet<Author>
reprezentujúcu tabuľku
autorov:
S takto nadefinovaným
databázovým kontextom nám Entity Framework Core neskôr v databáze
vygeneruje tabuľku Authors
so stĺpcami odvodenými z vlastností
triedy Author
.
Spojenie s databázou
Aby sme sa mohli pripojiť k akejkoľvek databáze, tak najskôr potrebujeme mať vytvorený tzv. connection string. Ide o reťazec, ktorý obsahuje všetky údaje potrebné na pripojenie k databáze. Typicky obsahuje adresu servera s databázou, názov databázy, prípadné heslo a ďalšie.
Connection string je možné odovzdať databázovému kontextu viacerými
spôsobmi, my zvolíme ten najjednoduchší, teda metódu
OnConfiguring()
. Ide o virtuálnu metódu triedy
DbContext
, ktorá v parametri prijíma inštanciu triedy
DbContextOptionsBuilder
. Na tejto inštancii budeme vykonávať
všetky konfigurácie spojenia s databázou.
Na konfiguráciu connection stringu ponúka pre triedu
DbContextOptionsBuilder
každý poskytovateľ databázy svoje
rozširujúce metódy. V prípade Microsoft SQL Server databáz sa jedná o
metódu UseSqlServer()
:
V našom databázovom
kontexte sme prepísali spomínanú metódu OnConfiguring()
a na
inštancii triedy DbContextOptionsBuilder
zavolali metódu
UseSqlServer()
. Tejto metóde sme odovzdali connection string
popisujúci spojenie k našej budúcej databáze, ktorú nám Entity Framework
Core vygeneruje.
Tento connection string sa skladá z dvoch položiek:
Server
- adresa servera, na ktorom databáza pobeží (v našom prípade sa jedná o LocalDB),Database
- názov samotnej databázy (FirstEFCoreDatabase
).
V budúcej lekcii, Generovanie databázy v Entity Framework Core a C# .NET , si z nášho prvého modelu necháme vygenerovať databázu.