Lekce 2 - Instalace a první model v Entity Framework Core a C# .NET
V minulé lekci, Úvod do Entity Framework Core v C# .NET, jsme si uvedli a porovnali různé způsoby práce s relačními databázemi v C# .NET.
V dnešním Entity Framework Core tutoriálu, v jazyce C# .NET, si připravíme Visual Studio a založíme náš první projekt s Entity Framework Core, který si nainstalujeme. Nakonec ještě začneme pracovat na tvorbě jednoduchého modelu.
V našem prvním projektu budeme používat odlehčenou verzi Microsoft SQL Server databáze označovanou LocalDB. Tato databáze se nejčastěji používá buďto při vývoji aplikace, a ve finální verzi je nahrazena, anebo někdy i jako lokální úložiště dat.
Ve druhém případě se však spíše volí databáze SQLite.
Příprava LocalDB
LocalDB je možné si nainstalovat skrze Visual Studio Installer, a to buď v rámci sady funkcí Ukládání a zpracování dat (Data storage and processing), anebo Vývoj pro ASP.NET a web (ASP.NET and web development).
Jestli některou z těchto sad máme nainstalovanou, si ověříme ve Visual Studio Installer kliknutím na Změnit u námi používané verze Visual Studia. Ujistíme se, že máme zaškrtnutou aspoň jednu z těchto sad, případně některou zaškrtneme a změny potvrdíme:

Alternativně můžeme LocalDB nainstalovat jen jako samostatnou komponentu SQL Server Express 2019 LocalDB v odpovídající záložce Jednotlivé komponenty:

Kurz je psaný s použitím Visual Studio 2022.
Database First a Code First přístup
V lekci Úvod do Entity Framework Core v C# .NET jsme si již řekli, že k tomu, abychom v Entity Framework Core mohli komunikovat s SQL databází, potřebujeme tzv. model. Modelem chápeme popis struktury databáze ve formě C# tříd. Tento popis se skládá zejména z jednotlivých entit a databázového kontextu.
V Entity Framework Core můžeme zvolit jeden ze dvou přístupů, jak takový model vytvořit. Konkrétně se jedná o přístupy Database First a Code First.
Database First
Přístup Database First předpokládá, že se chceme připojit k již existující SQL databázi. Všechny třídy našeho modelu tak musíme uzpůsobit tabulkám dané databáze, aby přesně kopírovaly jejich strukturu. I když Entity Framework Core naštěstí nabízí nástroje, které dokáží z SQL databáze automaticky vygenerovat model zcela za nás, tak tento přístup v dnešní době již není úplně populární. Pro tvorbu i té nejjednodušší databáze po nás totiž vyžaduje psaní SQL příkazů.
Code First
Mnohem populárnější je opačný přístup, přistup Code First, kdy nejprve napíšeme náš model a následně si z něj necháme automaticky vygenerovat celou databázi. Při tvorbě aplikace tak nemusíme přecházet mezi dvěma různými jazyky, vše píšeme pouze v jazyce C#, a vyhneme se tak množství chyb z nepozornosti. Entity Framework Core dokonce nabízí prostředky pro snadnou a bezpečnou aktualizaci databáze po změně definice modelu.
My pro náš projekt zvolíme právě přístup Code First. První si tedy napíšeme třídy pro entity a databázový kontext a databázi si z nich poté necháme vygenerovat.
Založení projektu
Nyní se již můžeme vrhnout na tvorbu našeho prvního projektu. Celý kurz se bude věnovat především tvorbě databáze a komunikaci s ní, nebudeme se tak zabývat tvorbou nějakého sofistikovaného uživatelského rozhraní. Entity Framework Core naštěstí není vázaný na jeden konkrétní typ projektu, proto budou všechny naše projekty v tomto kurzu jednoduché konzolové aplikace.
V případě, že by vás zajímalo, jak Entity Framework Core zapracovat do ASP.NET Core projektu, tak můžete po absolvování tohoto kurzu navštívit odpovídající sekci ASP.NET Core - Webové aplikace v C#, kde jej používáme téměř v každém kurzu.
Otevřeme si tedy Visual Studio a vytvoříme novou C# .NET konzolovou
aplikaci, kterou si pojmenujeme třeba FirstEFCoreProject:

Verzi frameworku zvolíme ideálně tu nejnovější, v našem případě .NET 7:

Instalace Entity Framework Core
Entity Framework Core se do C# .NET projektů instaluje prostřednictvím
NuGet balíčků. Těchto balíčků máme k dispozici více podle
poskytovatelů databází. My využijeme balíček
Microsoft.EntityFrameworkCore.SqlServer určený pro Microsoft SQL
Server databáze.
V okně Solution Explorer tedy klikneme pravým tlačítkem na
Solution a zvolíme Manage NuGet Packages for Solution.... V
záložce Browse si vyhledáme a vybereme balíček
Microsoft.EntityFrameworkCore.SqlServer. Poté v menu napravo
zaškrtneme náš jediný projekt a vybereme nejnovější dostupnou verzi
balíčku pro .NET, ve kterém aplikaci vyvíjíme.
Jestliže vyvíjíme například v .NET 7,
tak balíčky nainstalujeme ve verzi 7.x.y, kde x a
y jsou největší možná čísla.
Instalaci potvrdíme tlačítkem Install:

Tím máme náš projekt připravený a můžeme se dát na psaní kódu.
Entita Author
V našem prvním projektu budeme mít pouze jednu entitu, a to entitu
Author představující autora článků v redakčním systému.
Entita bude mít vlastnosti:
Id- unikátní identifikátor autora,Name- jméno,LastName- příjmení,BirthDate- datum narození,ArticlesCount- počet napsaných článků.
Přidejme si do projektu novou třídu Author s výše
uvedenými vlastnostmi:
namespace FirstEFCoreProject; public class Author { [Key] public int Id { get; set; } public string Name { get; set; } = ""; public string LastName { get; set; } = ""; public DateTime BirthDate { get; set; } public int ArticlesCount { get; set; } }
Od Visual Studio 2022 jsou všechny projekty automaticky
generovány s povolenou funkcí nullovatelných referenčních
typů (funkce přidána v C# 8.0). Tato funkce nám umožňuje nastavit
hodnotu null pouze atributům nebo vlastnostem, které mají
definici typu označenou operátorem ?, a to i v případě, že se
jedná o referenční datový typ. Každý atribut nebo
vlastnost referenčního datového typu tak musí mít při vytváření objektu
nastavenou nějakou výchozí hodnotu jinou než null, pokud není
označen jako nullovatelný operátorem ?. Proto našim vlastnostem
nastavujeme jako výchozí hodnotu prázdný řetězec.
Vlastnost Id jsme anotovali atributem [Key] ze
jmenného prostoru System.ComponentModel.DataAnnotations. Tímto
atributem říkáme, že se odpovídající sloupec v databázi vygeneruje s
primárním klíčem. Každý záznam tak bude moci v tomto
sloupci obsahovat pouze unikátní hodnoty a bude díky tomu tímto sloupcem
jednoznačně identifikovatelný. Ve výchozím nastavení musí mít všechny
entity v Entity Framework Core svůj primární klíč.
Databázový kontext
Databázi nám bude spolu s entitou Author popisovat
databázový kontext. Databázovým kontextem je jakýkoliv potomek třídy
DbContext.
V databázovém kontextu definujeme připojení k databázi, jaké tabulky má databáze obsahovat, vztahy mezi těmito tabulkami a mnohé další. Instance databázového kontextu představuje spojení s databází, které lze použít k dotazování a ukládání dat do databáze.
Naším databázovým kontextem bude třída FirstDbContext,
kterou si přidáme do projektu:
namespace FirstEFCoreProject; public class FirstDbContext : DbContext { }
Třídu jsme podědili od zmiňované třídy DbContext, kterou
nalezneme ve jmenném prostoru Microsoft.EntityFrameworkCore.
Tabulky
Jednotlivé tabulky databáze reprezentujeme v databázovém kontextu
vlastnostmi typu DbSet<T>. Přidejme si do našeho
databázového kontextu vlastnost Authors typu
DbSet<Author> reprezentující tabulku
autorů:
namespace FirstEFCoreProject; public class FirstDbContext : DbContext { public DbSet<Author> Authors { get; set; } }
S takto nadefinovaným databázovým kontextem nám Entity Framework Core
později v databázi vygeneruje tabulku Authors se sloupci
odvozenými z vlastností třidy Author.
Spojení s databází
Abychom se mohli připojit k jakékoliv databázi, tak nejprve potřebujeme mít vytvořený tzv. connection string. Jedná se o řetězec, který obsahuje všechny údaje potřebné k připojení k databázi. Typicky obsahuje adresu serveru s databází, název databáze, případné heslo a další.
Connection string lze předat databázovému kontextu vícero způsoby, my
zvolíme ten nejjednodušší, tedy metodu OnConfiguring(). Jedná
se o virtuální metodu třídy DbContext, která v parametru
přijímá instanci třídy DbContextOptionsBuilder. Na této
instanci budeme provádět veškeré konfigurace spojení s databází.
Ke konfiguraci connection stringu nabízí pro třídu
DbContextOptionsBuilder každý poskytovatel databáze své
rozšiřující metody. V případě Microsoft SQL Server databází se jedná o
metodu UseSqlServer():
namespace FirstEFCoreProject; public class FirstDbContext : DbContext { public DbSet<Author> Authors { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=FirstEFCoreDatabase"); } }
V našem databázovém kontextu jsme přepsali zmiňovanou metodu
OnConfiguring() a na instanci třídy
DbContextOptionsBuilder zavolali metodu
UseSqlServer(). Této metodě jsme předali connection string
popisující spojení k naší budoucí databázi, kterou nám Entity Framework
Core vygeneruje.
Tento connection string se skládá ze dvou položek:
Server- adresa serveru, na kterém databáze poběží (v našem případě se jedná o LocalDB),Database- název samotné databáze (FirstEFCoreDatabase).
To bude pro tuto lekci vše.
V příští lekci, Generování databáze v Entity Framework Core a C# .NET, si z našeho prvního modelu necháme vygenerovat databázi.
Měl jsi s čímkoli problém? Zdrojový kód vzorové aplikace je ke stažení každých pár lekcí. Zatím pokračuj dál, a pak si svou aplikaci porovnej se vzorem a snadno oprav.

