Java týden Body zdarma
Využij podzimních slev a získej od nás až 40 % bodů zdarma! Více zde
Pouze tento týden sleva až 80 % na Java e-learning!

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

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Úprava template MVC v ASP.NET Core, jsme si upravili předgenerovaný projekt z Visual Studia do podoby osobního blogu. Dnešní C# .NET tutoriál bude nabitý nejmodernějšími technologiemi, pomocí kterých vytvoříme během okamžiku administraci článků na blogu.

Scaffolding

Scaffolding v ASP.NET Core MVC

Webové frameworky jsou koncipované tak, aby co nejvíce zjednodušily práci programátora a zejména zredukovaly množství kódu, které musí napsat. Ačkoli se jim to daří, tak stále existují situace, kde je určité množství stereotypního kódu nutné a neexistuje způsob, jakým by ho framework mohl nahradit.

Chystáme se programovat administraci článků na webu a proto budeme potřebovat nějaký kontroler, model článku, databázovou tabulku a 5 pohledů (výpis, editace, přidání, odstranění, detail). Tyto součásti aplikace jednoduše musí obsahovat a nezáleží na tom, v jak geniálním jazyce ji programujeme. Nemusí je však stereotypně psát programátor, ale může je za nás vygenerovat IDE. Tomuto principu se říká scaffolding (nejlepší překlad je asi lešení, kostra). Visual Studio nám jednoduše předgeneruje databázi, kontroler a pohledy. Získáme tak kostru se základní funkčností, kterou pouze upravíme.

Entity framework

S databází budeme pracovat pomocí technologie Entity Framework Core, což je tzv. ORM (objektově-relační mapování). Databázové tabulky se přímo mapují na C# třídy, v kódu pracujeme jen s objekty a framework sám na pozadí generuje SQL dotazy. S jazykem MS-SQL vůbec nepřijdeme do styku a naše aplikace je 100% objektová. Ačkoli se budu snažit vše podrobně popisovat, doporučím nováčkům na poli ORM návštěvu sekce Databáze v C# .NET, kde je ORM popsané podrobněji.

Code First a Database First přístupy

S Entity Frameworkem můžeme pracovat dvěma způsoby. Můžeme vytvořit C# třídu a EF nám podle ní automaticky vygeneruje databázovou tabulku a potřebný kontext. Tomuto přístupu se říká Code First. Druhý způsob spočívá v založení databáze, ze které nám EF vygeneruje třídy a kontext. Asi vás nepřekvapí, že se druhý přístup jmenuje Database First. Jelikož vytvořit třídu je mnohem jednodušší než vytvořit databázi, zvolil jsem pro tutoriál přístup Code-First.

Vytvoření modelu

Protože Entity Framework používá určité konvence a převádí názvy tříd do množného čísla, budeme aplikaci psát anglicky, aby názvy nebyly zkomolené. Do složky Models si tedy přidejme novou třídu Article. Bude vypadat takto:

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

Třída obsahuje několik vlastností, konkrétně:

  • id
  • obsah
  • titulek
  • popisek

Můžete si k článku přidat např. ještě datum publikace a podobně. Id musí mít každá entita. Až z kódu vygenerujeme tabulky, tak se stane jejím primárním klíčem, který bude články jednoznačně odlišovat i kdyby měly třeba stejný titulek.

Rebuild

Aby uměl Entity Framework databázi vygenerovat, musíme projekt rebuildovat, jelikož ještě nebyl s touto třídou sestaven. Toho dosáhneme kliknutím pravým na projekt v Solution Exploreru a výběrem možnosti Rebuild. Třída se tím zkompiluje.

Rebuild projektu v ASP.NET Core MVC
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Nyní si do složky Controllers přidáme nový kontroler. Zobrazí se nám dialog s výběrem Scaffoldingu, kde zvolíme MVC Controller with views, using Entity Framework.

Scaffolding controller v ASP.NET Core MVC

Jako model zvolíme naši třídu Article a jako datový kontext vybereme již existující kontext aplikace, ve kterém jsou uživatelé a jejich role. Jako název kontroleru ponecháme defaultní ArticlesController. Všimněte si, že můžeme i nastavit zda chceme používat layout a několik dalších věcí.

Scaffolded controler v ASP.NET Core MVC

Dialog potvrdíme.

Byl nám vygenerován ArticlesController s několika metodami (akcemi). Nalezneme zde akce:

  • Index() - Výpis všech článků
  • Details() - Výpis jednoho článku
  • Create() - Vytvoření článku
  • Edit() - Editace článku
  • Delete() - Odstranění článku

Když se podíváme do složky Views, nalezneme zde složku Articles a v ní 5 pohledů pro tyto akce.

Aplikaci nyní spustíme a přejdeme na záložku Články. Projekt vám nyní buď zobrazí chybovou hlášku nebo bude fungovat, záleží na verzi jednotlivých nástrojů.

Seznam článků v ASP.NET Core MVC

Migrace

Pokud vám stránka Články ukáže chybu, nebyla zavolána databázová migrace. V našem případě to znamená, že jsme si sice vytvořili třídu Article, ale zatím v databázi neexistuje korespondující tabulka. Aby databáze odpovídala našim modelům, musíme na ní provádět tzv. migrace. Ve Visual Studiu vyberte v horním menu Tools -> NuGet Package Manager -> Package Manager Console. V dolní části okna se vám otevře konzole. Tam zadejte příkaz:

Add-Migration Vytvoreni_Clanku

Vytvoreni_Clanku je název naší migrace, můžete zadat i jakýkoli jiný. Potvrďte klávesou Enter. Spuštění bude chvilku trvat.

Jakmile migrace vytvoříme, musíme je na databázi spustit. To provedeme příkazem:

Update-Database

Kdykoli vytvoříme nový databázový model, nějaký odstraníme nebo změníme (např. do něj přidáme nějakou vlastnost, nějakou odstraníme a pod.), provedeme tento postup. VS za nás aktualizuje databázi i kontext Entity Frameworku, aby v něm byly všechny změny promítnuté.

Pokud vám aplikace nefungovala, spusťte ji nyní znovu a přejděte na odkaz Články. Vidíme, že administrace článků se vygenerovala automaticky a je plně funkční. Můžeme si zkusit přidat nějaký testovací článek:

Přidání nového článku v ASP.NET Core MVC

Zobrazí se nám v seznamu článků:

Seznam článků v ASP.NET Core MVC

A můžeme si ho také otevřít pomocí odkazu Details:

Detail článku v ASP.NET Core MVC

Všimněte si URL adresy:

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

První parametr označuje název kontroleru, který se má spustit (ArticlesController), druhý je název jeho metody (Details()). V předchozích aplikacích jsme měli v kontroleru vždy jen jednu metodu (Index()) a ta se spustí automaticky, když žádný parametr nezadáme. Další parametry v adrese jsou parametry dané akce (metody) v kontroleru, zde se jedná o Id článku, který zobrazujeme.

O tomto mechanismu, který převádí URL adresu na volání metod kontroleru (routování) jsme si již ve zkratce řekli v předchozích lekcích. Jen pro připomenutí doplním, že jeho nastavení můžeme měnit v Startup.cs.

Metoda Details() v ArticlesController vypadá 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ý parametr id je zapsán jako obyčejný parametr metody. Získání článku z databáze má na svědomí opravdu jen tento řádek:

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

Pokud jste Entity Framework neznali, tak ho nyní asi budete milovat :)

Databáze je uložená v lokálním souboru, ovšem nikoli ve složce projektu, ale ve vaší uživatelské složce v C:\Users\<vaše jméno>. Můžete se do ní podívat, soubor s databází má příponu .mdf. Toto také znamená, že pokud vám něco nepůjde a budete si chtít dnes nebo kdykoli příště stáhnout hotové řešení pod článkem, databáze v něm nebude a projekt nebude fungovat. Po stažení projektu je nutné zavolat příkazy Add-Migration Nazev_Migrace a Update-Database v Package Manager Console, čímž se vám prázdná databáze pro příslušný projekt vytvoří. Poté bude stažený projekt teprve fungovat

Zkuste si pročíst zdrojový kód dnešního řešení a zopakovat si ještě jak vše funguje. V příští lekci, Úprava administrace článků a editor v ASP.NET Core MVC, začneme scaffoldovaný kód upravovat tak, aby se články přiblížily nějaké naší představě. Projekt je jako vždy níže ke stažení.


 

Stáhnout

Staženo 76x (2.39 MB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

 

Článek pro vás napsal Martin Petrovaj
Avatar
Jak se ti líbí článek?
6 hlasů
Autor je lenivý vymýšľať nejaký slušný podpis. Venuje sa ale prevažne C#.
Předchozí článek
Úprava template MVC v ASP.NET Core
Všechny články v sekci
Základy ASP.NET Core MVC
Miniatura
Následující článek
Úprava administrace článků a editor v ASP.NET Core MVC
Aktivity (4)

 

 

Komentáře
Zobrazit starší komentáře (7)

Avatar
Jan Hodic
Člen
Avatar
Jan Hodic:14.11.2018 6:39

Delal jsem migraci k tride Immobilities. Dostal jsem nasledujici chybu:

Add-Migration Immobilities
Both Entity Framework 6.x and Entity Framework Core commands are installed. The Entity Framework 6 version is executing. You can fully qualify the command to select which one to execute, 'EntityFramewor­k\Add-Migration' for EF6.x and 'EntityFramewor­kCore\Add-Migration' for EF Core.
Exception calling "SetData" with "2" argument(s): "Typ Microsoft.Visu­alStudio.Projec­tSystem.VS.Im­plementation.Pac­kage.Automati­on.OAProject v sestavení Microsoft.Visu­alStudio.Projec­tSystem.VS.Im­plementat
ion, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f­11d50a3a není označen jako serializovatelný."
At C:\Users\Hodic\­.nuget\packages\en­tityframework\6­.2.0\tools\En­tityFramework­.psm1:720 char:5

  • $domain.SetDa­ta('project', $project)
  • ~~~~~~~~~~~~~­~~~~~~~~~~~~~~~~~~~~~~~
    • CategoryInfo : NotSpecified: (:) [], MethodInvocati­onException
    • FullyQualifie­dErrorId : SerializationEx­ception

Exception calling "SetData" with "2" argument(s): "Typ Microsoft.Visu­alStudio.Projec­tSystem.VS.Im­plementation.Pac­kage.Automati­on.OAProject v sestavení Microsoft.Visu­alStudio.Projec­tSystem.VS.Im­plementat
ion, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f­11d50a3a není označen jako serializovatelný."
At C:\Users\Hodic\­.nuget\packages\en­tityframework\6­.2.0\tools\En­tityFramework­.psm1:721 char:5

  • $domain.SetDa­ta('contextPro­ject', $contextProject)
  • ~~~~~~~~~~~~~­~~~~~~~~~~~~~~~~~~~~~~~~­~~~~~~~~~~~~~
    • CategoryInfo : NotSpecified: (:) [], MethodInvocati­onException
    • FullyQualifie­dErrorId : SerializationEx­ception

Exception calling "SetData" with "2" argument(s): "Typ Microsoft.Visu­alStudio.Projec­tSystem.VS.Im­plementation.Pac­kage.Automati­on.OAProject v sestavení Microsoft.Visu­alStudio.Projec­tSystem.VS.Im­plementat
ion, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f­11d50a3a není označen jako serializovatelný."
At C:\Users\Hodic\­.nuget\packages\en­tityframework\6­.2.0\tools\En­tityFramework­.psm1:722 char:5

  • $domain.SetDa­ta('startUpPro­ject', $startUpProject)
  • ~~~~~~~~~~~~~­~~~~~~~~~~~~~~~~~~~~~~~~­~~~~~~~~~~~~~
    • CategoryInfo : NotSpecified: (:) [], MethodInvocati­onException
    • FullyQualifie­dErrorId : SerializationEx­ception

System.NullRe­ferenceExcepti­on: Odkaz na objekt není nastaven na instanci objektu.
v System.Data.En­tity.Migration­s.Extensions.Pro­jectExtension­s.GetProperty­ValueT
v System.Data.En­tity.Migration­s.MigrationsDo­mainCommand.Get­Facade(String configuration­TypeName, Boolean useContextWor­kingDirectory)
v System.Data.En­tity.Migration­s.AddMigration­Command.Execu­te(String name, Boolean force, Boolean ignoreChanges)
v System.Data.En­tity.Migration­s.AddMigration­Command.<>c__Dis­playClass2.<.ctor>b__0()
v System.Data.En­tity.Migration­s.MigrationsDo­mainCommand.E­xecute(Action command)
Odkaz na objekt není nastaven na instanci objektu.

 
Odpovědět 14.11.2018 6:39
Avatar
Petr Brezina
Člen
Avatar
Petr Brezina:27. února 21:36

Ahoj taky to delam presne podle navodu a mam to ne az tak malinky ale je to hodne mali o proti obrazku zde.Koukal sem na stazenou predlohu ale nevim kde je chyba myslim ze pri vytvareni controleru jestli nekdo nasel chybu pls napis te sem.

 
Odpovědět 27. února 21:36
Avatar
Petr Brezina
Člen
Avatar
Petr Brezina:1. března 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.

 
Odpovědět 1. března 9:44
Avatar
Jan Hodic
Člen
Avatar
Jan Hodic:21. března 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.

 
Odpovědět 21. března 13:13
Avatar
Franco Berlusco:12. dubna 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...

 
Odpovědět 12. dubna 17:16
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na Franco Berlusco
Jan Navrátil:22. dubna 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 :-)

 
Odpovědět 22. dubna 12:59
Avatar
Patrik Pastor:8. června 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

 
Odpovědět 8. června 14:08
Avatar
lafleur.aa
Člen
Avatar
lafleur.aa:27. července 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.

 
Odpovědět 27. července 21:57
Avatar
Radovan Škvor:6. září 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

 
Odpovědět 6. září 14:56
Avatar
Odpovídá na Radovan Škvor
Radovan Škvor:6. září 15:22

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

 
Odpovědět 6. září 15:22
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 17. Zobrazit vše