Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

1. diel - Úvod do Entity Framework Core v C# .NET

Vitajte pri prvej lekcii kurzu o programovaní databázových aplikácií s použitím technológie Entity Framework Core. Po absolvovaní tohto kurzu budeme vedieť pracovať s relačnými databázami úplne objektovým prístupom, iba v jazyku C# .NET. Pri komunikácii s akoukoľvek databázou tak už nebudeme musieť napísať ani jeden riadok SQL kódu.

V dnešnom Entity Framework Core tutoriále si uvedieme rôzne spôsoby práce s relačnými databázami v C# .NET a porovnáme ich s fungovaním Entity Framework Core.

Prístupy k relačnej databáze v .NET

Relačné databázy sú časom overený spôsob ako pracovať s dátami. Vďaka tomu tento typ databáz dominuje celému trhu a ich použitie sa tak pri tvorbe aplikácií mnohokrát nevyhneme. Relačné databázy však na rozdiel od jazyka C# nefungujú objektovo a komunikácia s nimi teda nie je úplne priamočiara.

Z kurzu Databáza v C# - ADO.NET už vieme, že v .NET existuje niekoľko možností, ako sa s týmto vysporiadať. V rýchlosti si ich pripomenieme.

Existujú aj databázy plne objektové. Príkladom takejto databázy je napríklad MongoDB. Viac v lekcii Úvod do MongoDB.

Neobjektové programovanie

Prvou možnosťou je samozrejme programovať úplne bez objektov. Tým by sme však šli proti prúdu, nemohli by sme používať žiadne komponenty tretích strán a náš kód by bol veľmi nekvalitný. Keďže C# je objektový jazyk, ani by to v ňom dosť dobre nešlo.

V .NET sa tomuto prístupu najviac blíži použitie triedy SqlCommand, pomocou ktorej je možné priamo na databázu zasielať SQL dotazy. Dáta z databázy sú nám vrátené v podobe poľa hodnôt. Ukážme si použitie tejto triedy na jednoduchom príklade databázy s tabuľkou užívateľov Users:

FirstName LastName BirthDate
Ján Novák 11.3.1984
Michaela Sláviková 14.8.1990
Jozef Nový 20.12.1972
Kód na vypísanie všetkých užívateľov zoradených podľa dátumu narodenia by potom vyzeral nasledovne:

Databázový Wrapper

Prístup tzv. wrappera nám umožňuje s databázou pracovať ako s objektom, ale komunikujeme s ňou stále v jej jazyku SQL. Miešame teda objektový a relačný kód. Prístup je akýmsi kompromisom a vyžaduje filozofiu OOP trochu ohnúť. Výhodou je zachovanie výkonu a schopností databázy za cenu miernej degradácie myšlienok OOP.

Dáta z databázy vidíme najčastejšie ako hodnoty v tabuľke (tá je objektom) a prichádzame o možnosť prideliť entitám nejakú funkcionalitu. Tú namiesto toho združujeme do tzv. manažérov. Je možné aj čiastočne mapovať dáta na existujúce triedy, avšak plnohodnotný koncept objektového modelu nedosiahneme.

V .NET je tento prístup realizovaný triedami SqlDataAdapter a DataSet. DataSet v sebe obsahuje tabuľky, tabuľka riadky a riadok stĺpca. Tabuľka je objekt, môžeme do nej riadky pridávať a upravovať ich bez písania SQL kódu. Keď chceme spustiť na databázu nejaký príkaz, použijeme DataAdapter, pomocou ktorého si naplníme DataSet dátami. Príkazy už musíme písať v jazyku SQL danej databázy.

Rovnaký výpis tabuľky z príkladu vyššie by sme s použitím tried SqlDataAdapter a DataSet vykonali takto:

Máme teda určitú objektovú abstrakciu, s tabuľkami pracujeme objektovo, ale dáta sú stále iba stĺpčekmi v tabuľke. Tiež stále používame jazyk SQL.

Objektovo relačné mapovanie

Objektovo relačné mapovanie (ORM) ide ortodoxne za myšlienkou OOP. Z databázy teda namiesto poľa hodnôt dostávame rovno objekty a tie na sebe majú metódy. V jazyku SQL vôbec nekomunikujeme, tabuľky v databáze vidíme ako kolekcia objektov, s ktorými môžeme pracovať bežnými prostriedkami jazyka. Sme vlastne úplne odtienení od toho, že pracujeme s relačnou databázou. Znie to skvele, že?

Háčik je samozrejme v tom, že na pozadí dochádza k veľkej degradácii výkonu databázy, SQL dotazy sa generujú automaticky a sú často neefektívne. Ďalším problémom ORM je, že je veľmi zložité (nie na použitie, ale na naprogramovanie).

.NET našťastie perfektne odladené ORM ponúka, je ním práve Entity Framework Core.

Názory na ORM sú veľmi kontroverzné. Napríklad že samotná jeho myšlienka je nesprávna, pretože generovaný SQL kód skrátka nemôže byť efektívny a je nutné pomýšľať na jeho konečnú podobu. Odtienenie od práce s relačnou databázou teda nie je úplné.

Entity Framework Core

Entity Framework Core je teda tzv. O bjektovo R elačné M apper (ORM) pre prístup k databázam. Vychádza zo staršieho Entity Frameworku, na rozdiel od ktorého je ale rozšíriteľný, úplne open source a predovšetkým multiplatformný.

Túto technológiu vyvíja priamo Microsoft, má tak vcelku istú dlhodobú podporu.

Ako to zhruba funguje

Aby sme mali porovnanie všetkých možností práce s databázou kompletnou, tak si nakoniec ešte načrtneme, ako v Entity Framework Core funguje samotný prístup k databáze. Podrobne si všetko však rozoberieme až v budúcich lekciách. Nasledujúci kód teda berme čisto len ako ukážku, nemusíme v ňom zatiaľ úplne všetkému rozumieť.

Prístup k databáze je v Entity Framework Core realizovaný cez tzv. model, ktorý predstavuje popis štruktúry databázy vo forme C# tried. Tento popis sa skladá najmä z entít a databázového kontextu.

Entita

Pod entitou si môžeme jednoducho predstaviť tabuľku databázy, ktorú v C# reprezentujeme triedou. Napríklad entita prestavujúca používateľa z príkladu vyššie by mohla vyzerať nasledovne:

Jednotlivé záznamy tabuľky Users potom chápeme ako inštancie tejto triedy User.

Záznamy tabuľky budeme niekedy zjednodušene označovať taktiež pojmom "entita".

Databázový kontext

Databázový kontext potom predstavuje a definuje samotné prepojenie s databázou, všetky tabuľky databázy (entity) a väzby medzi nimi. Databázový kontext s tabuľkou Users z príkladu vyššie by mohol vyzerať napríklad takto:

Čítanie dát

Akékoľvek otázky na databázu následne voláme prostredníctvom inštancie nášho databázového kontextu:

Vidíme, že na získanie všetkých užívateľov z databázy sme nemuseli do C# kódu vmiešať žiadny SQL príkaz a udržali tak jeho jednoduchosť a predovšetkým čitateľnosť. S tabuľkami databázy pracujeme podobným spôsobom ako s kolekciami. Dobrá čitateľnosť je zaistená aj vďaka LINQ metódam, ktoré Entity Framework Core podporuje pre vyberanie dát z databázy.

LINQ metódy sme preberali v lekcii LINQ v C# .NET - Revolúcia v dotazovaní.

Poskytovatelia databáz

Vyššie spomínaná rozšíriteľnosť súvisí s tým, že cez Entity Framework Core môžeme pristupovať k mnohým rôznym databázam prostredníctvom dodatočných knižníc označovaných ako poskytovatelia databáz (database providers). Priamo Microsoft napríklad vyvíja poskytovateľa pre MS-SQL a SQLite databázy. Poskytovatelia pre PostgreSQL, Oracle alebo MySQL databázy sú však už vyvíjaní tretími stranami.

Poskytovateľa databáz si rovnako, ako samotný Entity Framework Core, inštalujeme cez NuGet balíčky. Pre vyššie uvedené databázy to sú napríklad balíčky:

Zoznam tých najvýznamnejších poskytovateľov nájdeme v oficiálnej dokumentácii.

Požiadavky na znalosti

Tento kurz predpokladá okrem znalostí v rozsahu:

taktiež:
  • minimálne teoretické znalosti z kurzu Databáza v C# - ADO.NET a
  • základné znalosti relačných databázových technológií spolu s jazykom SQL.
Napriek tomu, že v tomto kurze nebudeme písať žiadny SQL kód, tak je dobré mu aspoň rozumieť. A to predovšetkým pri snahe o rôzne optimalizácie alebo pri hľadaní chýb vo vygenerovanom SQL kóde. Nami napísaný C# kód sa totiž musí nakoniec vždy preložiť na SQL príkazy, ktoré sú volané na samotnej databáze.

V kurze budeme pracovať predovšetkým s MS-SQL databázou, s ktorou sa môžete bližšie zoznámiť v samostatnom kurze len o MS-SQL databáze MS-SQL databázy krok za krokom

To by bolo pre úvodnú lekciu všetko.

V budúcej lekcii, Inštalácia a prvý model v Entity Framework Core a C# .NET , si založíme náš prvý projekt s Entity Framework Core a vytvoríme jednoduchý model.


 

Všetky články v sekcii
Entity Framework Core v C# .NET
Preskočiť článok
(neodporúčame)
Inštalácia a prvý model 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