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.