80 % bodů zdarma na online výuku díky naší Letní akci!
Pouze tento týden sleva až 80 % na e-learning týkající se PHP

6. diel - Scaffolding a Entity Framework v ASP.NET Core MVC

V minulej lekcii, Úprava template MVC v ASP.NET Core , sme si upravili předgenerovaný projekt z Visual Studia do podoby osobného blogu. Dnešné C# .NET tutoriál bude nabitý najmodernejšími technológiami, pomocou ktorých vytvoríme behom okamihu administráciu článkov na blogu.

Scaffolding

Scaffolding v ASP.NET Core MVC

Webové frameworky sú koncipované tak, aby čo najviac zjednodušili prácu programátora a najmä zredukovali množstvo kódu, ktoré musí napísať. Hoci sa im to darí, tak stále existujú situácie, kde je určité množstvo stereotypného kódu nutné a neexistuje spôsob, akým by ho framework mohol nahradiť.

Chystáme sa programovať administráciu článkov na webe a preto budeme potrebovať nejaký kontrolér, model článku, databázovú tabuľku a 5 pohľadov (výpis, editácia, pridanie, odstránenie, detail). Tieto súčasti aplikácie jednoducho musí obsahovať a nezáleží na tom, v ako geniálnym jazyku ju programujeme. Nemusí je však stereotypne písať programátor, ale môže ich za nás vygenerovať IDE. Tomuto princípu sa hovorí scaffolding (najlepší preklad je asi lešenie, kostra). Visual Studio nám jednoducho předgeneruje databázu, kontrolér a pohľady. Získame tak kostru so základnou funkčnosťou, ktorú len upravíme.

Entity framework

S databázou budeme pracovať pomocou technológie Entity Framework Core, čo je tzv. ORM (objektovo-relačné mapovanie). Databázovej tabuľky sa priamo mapujú na C# triedy, v kóde pracujeme len s objektmi a framework sám na pozadí generuje SQL dotazy. S jazykom MS-SQL vôbec neprídeme do styku a naše aplikácie je 100% objektová. Hoci sa budem snažiť všetko podrobne popisovať, odporučím nováčikom na poli ORM návštevu sekcie Databáza v C# .NET, kde je ORM popísané podrobnejšie.

Code First a Database First prístupy

S Entity Framework môžeme pracovať dvoma spôsobmi. Môžeme vytvoriť C# triedu a EF nám podľa nej automaticky vygeneruje databázovú tabuľku a potrebný kontext. Tomuto prístupu sa hovorí Code First. Druhý spôsob spočíva v založenia databázy, z ktorej nám EF vygeneruje triedy a kontext. Asi vás neprekvapí, že sa druhý prístup volá Database First. Keďže vytvoriť triedu je oveľa jednoduchšie ako vytvoriť databázu, zvolil som pre tutoriál prístup Code-First.

Vytvorenie modelu

Pretože Entity Framework používa určité konvencie a prevádza názvy tried do množného čísla, budeme aplikáciu písať anglicky, aby názvy neboli skomolené. Do zložky Models si teda pridajme novú triedu Article. Bude vyzerať takto:

public class Article
{
    public int Id { get; set; }
    public string Content { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
}

Trieda obsahuje niekoľko vlastností, konkrétne:

  • id
  • obsah
  • titulok
  • popisok

Môžete si k článku pridať napr. Ešte dátum publikácie a podobne. Id musí mať každá entita. Až z kódu vygenerujeme tabuľky, tak sa stane jej primárnym kľúčom, ktorý bude články jednoznačne odlišovať aj keby mali potrebné rovnaký titulok.

Rebuild

Aby vedel Entity Framework databázu vygenerovať, musíme projekt rebuildovat, pretože ešte nebol s touto triedou zostavený. To dosiahneme kliknutím pravým na projekt v Solution Exploreri a výberom možnosti Rebuild. Trieda sa tým skompiluje.

Rebuild projektu v ASP.NET Core MVC
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

Teraz si do zložky Controllers pridáme nový kontrolér. Zobrazí sa nám dialóg s výberom scaffolding, kde zvolíme MVC Controller with views, using Entity Framework.

Scaffolding controller v ASP.NET Core MVC

Ako model zvolíme našu triedu Article a ako dátový kontext vyberieme už existujúce kontext aplikácie, v ktorom sú užívatelia a ich úloha. Ako názov kontroleru ponecháme defaultné ArticlesController. Všimnite si, že môžeme aj nastaviť či chceme používať layout a niekoľko ďalších vecí.

Scaffolded controler v ASP.NET Core MVC

Dialóg potvrdíme.

Bol nám vygenerovaný ArticlesController s niekoľkými metódami (akciami). Nájdeme tu akcie:

  • Index() - Výpis všetkých článkov
  • Details() - Výpis jedného článku
  • Create() - Vytvorenie článku
  • Edit() - Editácia článku
  • Delete() - Odstránenie článku

Keď sa pozrieme do zložky Views, nájdeme tu zložku Articles a v nej 5 pohľadov pre tieto akcie.

Aplikáciu teraz spustíme a prejdeme na záložku Články. Projekt vám teraz buď zobrazí chybovú hlášku alebo bude fungovať, záleží na verziu jednotlivých nástrojov.

Zoznam článkov v ASP.NET Core MVC

Migrácia

Ak vám stránka Články ukáže chybu, nebola zavolaná databázová migrácie. V našom prípade to znamená, že sme si síce vytvorili triedu Article, ale zatiaľ v databáze neexistuje korešpondujúce tabuľka. Aby databáza zodpovedala našim modelom, musíme na nej vykonávať tzv. Migrácie. Vo Visual Studiu vyberte v hornom menu Tools -> nugety Package Manager -> Package Manager Console. V dolnej časti okna sa vám otvorí konzola. Tam zadajte príkaz:

Add-Migration Vytvoreni_Clanku

Vytvoreni_Clanku je názov našej migrácia, môžete zadať aj akýkoľvek iný. Potvrďte klávesou Enter. Spustenie bude chvíľku trvať.

Akonáhle migrácia vytvoríme, musíme ich na databázu spustiť. To prevedieme príkazom:

Update-Database

Kedykoľvek vytvoríme nový databázový model, nejaký odstránime alebo zmeníme (napr. Do neho pridáme nejakú vlastnosť, nejakú odstránime a pod.), Vykonáme tento postup. VS za nás aktualizuje databázu aj kontext Entity Framework, aby v ňom boli všetky zmeny premietnuté.

Ak vám aplikácia nefungovala, spustite ju teraz znovu a prejdite na odkaz Články. Vidíme, že administrácia článkov sa vygenerovala automaticky a je plne funkčný. Môžeme si skúsiť pridať nejaký testovací článok:

Pridanie nového článku v ASP.NET Core MVC

Zobrazí sa nám v zozname článkov:

Zoznam článkov v ASP.NET Core MVC

A môžeme si ho tiež otvoriť pomocou odkazu Details:

Detail článku v ASP.NET Core MVC

Všimnite si URL adresy:

http://localhost:44311/Articles/Details/1

Prvý parameter označuje názov kontroleru, ktorý sa má spustiť (ArticlesController), druhý je názov jeho metódy (Details()). V predchádzajúcich aplikáciách sme mali v kontroleru vždy iba jednu metódu (Index()) a tá sa spustí automaticky, keď žiadny parameter nezadáme. Ďalšie parametre v adrese sú parametre dané akcie (metódy) v kontroleru, tu sa jedná o Id článku, ktorý zobrazujeme.

O tomto mechanizme, ktorý prevádza URL adresu na volanie metód kontroléra (routovanie) sme si už v skratke povedali v predchádzajúcich lekciách. Len pre pripomenutie doplním, že jeho nastavenie môžeme meniť v Startup.cs.

Metóda Details() v ArticlesController vyzerá takto:

// GET: Articles/Details/5
public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var article = await _context.Article
        .SingleOrDefaultAsync(m => m.Id == id);
    if (article == null)
    {
        return NotFound();
    }

    return View(article);
}

Nullovatelný parameter id je zapísaný ako obyčajný parameter metódy. Získanie článku z databázy má na svedomí naozaj len tento riadok:

var article = await _context.Article.SingleOrDefaultAsync(m => m.Id == id);

Ak ste Entity Framework nepoznali, tak ho teraz asi budete milovať :)

Databáza je uložená v lokálnom súbore, ale nie v priečinku projektu, ale vo vašej užívateľskej zložke v C:\Users\<vaše jméno>. Môžete sa do nej pozrieť, súbor s databázou má príponu .mdf. Toto tiež znamená, že ak vám niečo nepôjde a budete si chcieť dnes alebo kedykoľvek nabudúce stiahnuť hotové riešenie pod článkom, databázy v ňom nebude a projekt nebude fungovať. Po stiahnutí projektu je nutné zavolať príkazy Add-Migration Nazev_Migrace a Update-Database v Package Manager Console, čím sa vám prázdna databázy pre príslušný projekt vytvorí. Potom bude stiahnutý projektom iba fungovať

Skúste si prečítať zdrojový kód dnešného riešenia a zopakovať si ešte ako všetko funguje. V budúcej lekcii, Úprava administrácie článkov a editor v ASP.NET Core MVC , začneme scaffoldovaný kód upravovať tak, aby sa články priblížili nejakej našej predstave. Projekt je ako vždy nižšie k stiahnutiu.


 

Stiahnuť

Stiahnuté 114x (2.39 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Úprava template MVC v ASP.NET Core
Všetky články v sekcii
Základy ASP.NET Core MVC
Článok pre vás napísal Martin Petrovaj
Avatar
Ako sa ti páči článok?
Ešte nikto nehodnotil, buď prvý!
Autor je lenivý vymýšľať nejaký slušný podpis. Venuje sa ale prevažne C#.
Aktivity (1)

 

 

Komentáre

Avatar
Petr Brezina
Člen
Avatar
Petr Brezina:1.3.2019 9:44

Ahoj ten problem sem vyresil diky memu kamaradovy ktery je programator Mirek Disek zkopirujte si cely bootstrap z predlozenych dokumentu na stazeni, cely bootstrap prekopirujte do sveho vse mi beha tak jak ma.

 
Odpovedať
1.3.2019 9:44
Avatar
Jan Hodic
Redaktor
Avatar
Jan Hodic:21.3.2019 13:13

Zdravím! Chtěl bych si ukládat do databáze obrázky tak aby se k nim dostal jen přihlášený uživatel. Tedy ukládání odkazů ve formě stringu (myslím) nepřichází v úvahu. Jasně, metoda s použitím FileStream k ukládání binárního souboru tam někde určitě bude, ale nevím, jak to mám vyřešit s get-setem ve třídě, ze které se mi budou pomocí CodeFirst generovat sloupce v databázi. Co mám použít za typ Property?

Díky, Honza.

 
Odpovedať
21.3.2019 13:13
Avatar
Franco Berlusco:12.4.2019 17:16

V konzole správce balíčkú mi vypisuje na konci červenú hlášku:
PowerShell version 2.0 is not supported. Please upgrade PowerShell to 3.0 or greater and restart Visual Studio.

a keď napriek tomu spustím:
PM> Add-Migration Vytvoreni_Clanku

The Entity Framework Core Package Manager Console Tools don't support PowerShell version 2.0. Upgrade to PowerShell version 3.0 or higher, restart Visual Studio, and try again.

V správcovi som našiel na inštalovanie len PowerShell 1.0.0 ...

Poradí niekto...

 
Odpovedať
12.4.2019 17:16
Avatar
Odpovedá na Franco Berlusco
Jan Navrátil:22.4.2019 12:59

Ahoj, já jsem to vyřešil instalací této aktualizace a následným restartem počítače. Snad to pomůže :-)

 
Odpovedať
22.4.2019 12:59
Avatar
Patrik Pastor:8.6.2019 14:08

nevi nekdo, jak muzu soubor databaze *mdf otevrit v SQL managerovi?. Soubor jsem nasel mdf jsem nasel, ale kdyz chcu v ms studiu attach database, tak mi to v tento soubor mdf nenajde, ale nechapu proc kdyz to prave priponu *mdf hleda. Dik

 
Odpovedať
8.6.2019 14:08
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
lafleur.aa
Člen
Avatar
lafleur.aa:27.7.2019 21:57

Ahoj, mohl by mi prosim nekdo popsat uploadovani aplikace na freehosting? Jak a kde upravit connection string a dalsi potrebna nastaveni? Moc dekuji.

 
Odpovedať
27.7.2019 21:57
Avatar
Radovan Škvor:6.9.2019 14:56

Ahoj,

prosím o radu, při přidávání controleru nemám na výběr z již existujícího kontextu aplikace.
Vůbec si nevím rady

 
Odpovedať
6.9.2019 14:56
Avatar
Odpovedá na Radovan Škvor
Radovan Škvor:6.9.2019 15:22

Tak nic, jen nepozornost z předchozího článku :-@ :-D

 
Odpovedať
6.9.2019 15:22
Avatar
xxluky
Člen
Avatar
Odpovedá na Radovan Škvor
xxluky:27. júna 21:08

Mohu se zeptat, co byla ta nepozornost? Mám stejný problém.. Díky

 
Odpovedať
27. júna 21:08
Avatar
xxluky
Člen
Avatar
Odpovedá na xxluky
xxluky:29. júna 9:19

Ok, zjistil jsem, že je to problém s novější verzí. Ve VS 2017 to normálně funguje přesně podle tutoriálu se ukáže "Třída kontextu dat", ale bohužel ve VS 2019 nikoliv (třída je prázdná přesně jako na screenu od "Radovan Škvor") :-( Neví někdo proč a jak to vyřešit? Zkoušel jsem dokonce přes Package NuGet Manager přidat do projektu Entity Framework což nepomohlo.

 
Odpovedať
29. júna 9:19
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!