Body zdarma Java týden
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 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, 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 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 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, 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 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 a popisek. Můžete si k článku přidat např. ještě klíčová slova, 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 rebuildnout, 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 MVC

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

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

Jako název kontroleru zvolíme ArticleController, 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.

Scaffolded controler v ASP.NET MVC

Dialog potvrdíme.

Byl nám vygenerován ArticleController 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 Article a v ní 5 pohledů pro tyto akce.

Aplikaci nyní spustíme a přejdeme na záložku Články:

Seznam článků v ASP.NET MVC

Aplikaci zastavme a přejděme do Server Exploreru, kde mezi Data Connections nalezneme naše připojení k databázi. Mezi databázovými tabulkami aplikace nalezneme Articles:

Tabulka articles v ASP.NET MVC

Když si ji rozklikneme, má následující strukturu:

Struktura tabulky articles v ASP.NET MVC

Toto všechno se vygenerovalo opravdu jen na základě toho, že jsme do aplikace přidali třídu Article s několika vlastnostmi.

Můžeme si aplikaci zkusit znovu spustit a přidat nějaký testovací článek:

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

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

Seznam článků v ASP.NET MVC

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

Detail článku v ASP.NET MVC

Všimněte si URL adresy:

http://localhost:52220/Article/Details/1

První parametr označuje název kontroleru, který se má spustit (Article), 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 jsou parametry dané akce (metody) v kontroleru, zde se jedná o ID článku, který zobrazujeme.

Mechanismu, který převádí URL adresu na volání metod kontroleru se říká routování. Jeho nastavení můžeme měnit (ačkoli to asi nikdy dělat nebudeme) a naleznete ho App_Start/Rou­teConfig.cs.

Metoda details v ArticleController vypadá takto:

// GET: /Article/Details/5
public ActionResult Details(int? id)
{
        if (id == null)
        {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Article article = db.Articles.Find(id);
        if (article == null)
        {
                return HttpNotFound();
        }
        return View(article);
}

Nullovatelný parametr id je jako obyčejný parametr metody. Získání článku z databáze má na svědomí opravdu jen tento řádek:

Article article = db.Articles.Find(id);

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

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 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 459x (21.47 MB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
20 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Předchozí článek
Úprava template MVC v ASP.NET
Všechny články v sekci
Základy ASP.NET MVC
Miniatura
Následující článek
Úprava administrace článků a editor v ASP.NET MVC
Aktivity (4)

 

 

Komentáře

Avatar
mrrip
Člen
Avatar
mrrip:23.4.2014 0:31

Ahoj,
chtěl bych se zeptat odkud se bere ApplicationDbCon­text. Bohužel ho mezi kontexty nemám.

 
Odpovědět 23.4.2014 0:31
Avatar
Odpovídá na mrrip
Michal Štěpánek:9.5.2014 14:35

Mrkni se do složky Models -> IdentityModels

Odpovědět 9.5.2014 14:35
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
dave_23
Redaktor
Avatar
dave_23:21.3.2015 15:50

Zdravim, už si fakt nevim rady.
Vytvořil jsem si ArticleController, ale v Data Connection se mi nevygenerovala tabulka Articles. Pokud projekt teď spustím, a pokusím se otevřít záložku Články, tak mi VS vyhodí chybu: InvalidOperati­onException (The model backing the 'ApplicationDbCon­text' context has changed since the database was created), ve třídě ArticleControler při volání funkce Index(). Nenapadá vás kde jsem udělal chybu?

 
Odpovědět 21.3.2015 15:50
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na dave_23
David Čápka:21.3.2015 22:19

Zmigruj DB (jak je ukázáno v dalších dílech).

Odpovědět  +1 21.3.2015 22:19
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Jakub Džubák:24.2.2016 20:48

Ahoj, migracia DB > postupujte od Enabling Migrations https://msdn.microsoft.com/…j591621.aspx

 
Odpovědět 24.2.2016 20:48
Avatar
neky.d
Člen
Avatar
neky.d:7.3.2016 22:51

Ahoj, chci se zeptat jak docílit toho aby se nám nevytvořila nová databáze, ale aby se pracovalo s nějakou existující.

 
Odpovědět 7.3.2016 22:51
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:8.3.2016 0:16

nastavis DBinitializer na null.

Odpovědět 8.3.2016 0:16
Totalitní admini..
Avatar
Lukáš Baťha:25.6.2016 19:40

Dobrý den,

nechybí v popisu před vytvořením ArticleController něco. Tabulka se mi nevytvoří. Nemám před tímto krokem nejprve vytvořit DB resp. Connection. Rada migrovat DB také nikam nevedla.

Předem děkuji za odpověď

 
Odpovědět 25.6.2016 19:40
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Lukáš Baťha
vajkuba1234:25.6.2016 21:26

Mas vytvoreny model pro clanky? Z nej se vytvori tabulka po migraci. V kontroleru pak jen vytvoris instanci DbContextu a pracujes s ni v jednotlivych akcich...

Odpovědět 25.6.2016 21:26
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Odpovídá na vajkuba1234
Lukáš Baťha:25.6.2016 21:56

v modelu mám class Article s atributy...

 
Odpovědět 25.6.2016 21:56
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Lukáš Baťha
vajkuba1234:26.6.2016 12:26

Z tveho popisu fakt nelze zjistit nic. Zaloz si vlakno na foru, nahazej tam kontroler s modelem, co ti to pise nebo nepise. Btw. V modelu mas vlastnosti.

Odpovědět 26.6.2016 12:26
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Lukáš Baťha:26.6.2016 15:50

Díky za snahu. Podařilo se mi to způsobem "database first". Druhý způsob ještě zkusím.

 
Odpovědět 26.6.2016 15:50
Avatar
CesurMirka
Redaktor
Avatar
Odpovídá na Lukáš Baťha
CesurMirka:14.7.2016 14:40

A skusil si to zapnut a vypnut ? ...Nie naozaj, mala som podobny problem,ale po rebuildnuti, otvoreni a zatvoreni stranky v prahliadaci sa mi nakoniec databaza vytvorila.

 
Odpovědět 14.7.2016 14:40
Avatar
Mirek
Člen
Avatar
Mirek:26.12.2016 16:11

Boli tam 2 problemy:

  1. Visual Studio mi ponukol automaticky nazov kontroleru ArticlesContro­ller. Pre to "s" navyse to neslo. Preco si nemozem vybrat nazov, aky chcem?
  2. Ak je niekto prihlaseny do windows ako StandardUser a nie ako admin, tak mu to nevytvori databazu.
 
Odpovědět 26.12.2016 16:11
Avatar
David Novák
Člen
Avatar
David Novák:21.2.2017 8:57

Davide, děkuju za výborný tutoriál, vše funguje perfektně! David

 
Odpovědět 21.2.2017 8:57
Avatar
Ondřej Kíčruj:5.4.2017 10:32

Ahoj,
nejde mi vytvořit ArticleController. VS 2017 mi posílá hlášku, zkoušel jsem různé možnosti zmíněné zde v diskuzi, ale bohužel jsem se dál nedostal.

 
Odpovědět 5.4.2017 10:32
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Ondřej Kíčruj
vajkuba1234:5.4.2017 13:39

Zkousel jsi rebuild? - blbost
Stahl sis ten tutorial a chces na nej navazat a nebo to pises sam od zacatku?

Editováno 5.4.2017 13:41
Odpovědět 5.4.2017 13:39
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Ondřej Kíčruj:6.4.2017 7:48

Rebuild jsem zkoušel, píšu to od začátku. Zkusím to ještě stáhnout. To mě nevím proč nenapadlo. Dík.

 
Odpovědět 6.4.2017 7:48
Avatar
quartsik
Člen
Avatar
quartsik:26.4.2017 19:02

Ahoj, mám VS 2017 a postupoval jsem podle návodu.. vše funguje a DB se založila podle očekávání, nicméně když chci přidat článek, tak se mi nevygenerují okýnka na vyplnění textu... vypadá to asi jako na přiloženém obrázku... Nemáte někdo tušení, kde se mohla stát chyba?

 
Odpovědět 26.4.2017 19:02
Avatar
Michal Gros
Redaktor
Avatar
Odpovídá na quartsik
Michal Gros :30.4.2017 14:01

Někde si udělal chybu v generování DB . Máš správně vybraný model nebo nezapoměl jsi před tím rebuild? Mně vše funguje dobre. Jenom to trochu nesedi při generovaní databaze ze třídy. Chvilku jsem s tím bojoval a někde našel, že se to má genrovat proti rozhraní. Musel jsem si udělat rozrhani IArticle. Nicméně nakonec se mi to povedlo i bez něj.

Odpovědět 30.4.2017 14:01
Jestli jste dobří nahrnou na Vás spoustu práce. Jestli jste sakra dobří, tak se jí dokážete zbavit.
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Michal Gros
vajkuba1234:30.4.2017 16:01

Co se musi delat proti rozhrani? U Codefirst staci vytvorit modely, udelat relace v Contextu a provest migraci, ktera by mela vytvorit databazi. Spise bych videl problem v samotnem View...

Odpovědět 30.4.2017 16:01
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na quartsik
vajkuba1234:30.4.2017 16:02

Mas spravne view? Ono generuje vzhled...

Odpovědět 30.4.2017 16:02
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Michal Gros
Redaktor
Avatar
Odpovídá na vajkuba1234
Michal Gros :30.4.2017 16:07

Kód pro articles, nicméně je to asi jedno: Reagoval jsem to, že jsem taky měl problém s tvorbou db v VS2017 ruzně jsem brouzdal po netu nevím už kde. Někde jsem našel, že ta CodeFirst classa ma mít rozhrani a generovat se to má z něj. Ale jak jsem říklal nakonec se mi to daří i bez něj.

Odpovědět 30.4.2017 16:07
Jestli jste dobří nahrnou na Vás spoustu práce. Jestli jste sakra dobří, tak se jí dokážete zbavit.
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Michal Gros
vajkuba1234:30.4.2017 18:16

S tim rozhranim jsi to mozna asi spatne pochopil. Mozna tak muzes modelum dat nejake rozhrani, ze musi mit minimalne Id a specifikujes jakeho typu, treba. Ale s tvorbou db to nijak nesouvisi. Aspon co se tyce asp.net mvc 5

Odpovědět  +1 30.4.2017 18:16
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Lukáš Starenko:7.6.2017 10:58

Ahoj, ztroskotal jsem na tom, že po vytvoření ArticleControlleru spustím aplikaci a chci přejít na záložku "Články".
Ta se dlouho načítá a mi to vyhodí chybu že se nemůže připojit na server --> obrázek1

Při načítání projektu (mám ho stažený z minulého dílu) vyskočila tato hláška --> obrázek2

Stáhl a nainstaloval jsem Microsoft® SQL Server® 2014 Express (LocalDB) --> obrázek3

Ale pořád stejný problém, díky za rady :)

Editováno 7.6.2017 11:01
 
Odpovědět 7.6.2017 10:58
Avatar
Lukáš Starenko:7.6.2017 11:05

..

 
Odpovědět 7.6.2017 11:05
Avatar
Lukáš Starenko:7.6.2017 11:07

..

 
Odpovědět 7.6.2017 11:07
Avatar
Lukáš Starenko:7.6.2017 11:09

..

 
Odpovědět 7.6.2017 11:09
Avatar
Lukáš Starenko:8.6.2017 8:09

Aha koukám že už se to tu řešilo.

Další možností je změna connection stringu v souboru "Web.config" na novější verzi. --> http://www.michael-whelan.net/…tion-string/

To pomohlo mě

 
Odpovědět 8.6.2017 8:09
Avatar
Fenrix
Člen
Avatar
Fenrix:25.11.2017 18:47

Ahoj, nějak jsem nepostřehl jakým způsobem je v kódu řešený, že když kliknu na tlačítko např. Create, že se mi otevře nový okno apod. (prostě, že se onclick něco stane)? Jediný co v tom vidim, co by mohlo mít souvislost je: <input type="submit" value="Create" class="btn btn-default" />

právě to value="Create" vytváří propojení html kodu s modelem a controllerem?

 
Odpovědět 25.11.2017 18:47
Avatar
Odpovídá na Fenrix
Michal Štěpánek:26.11.2017 9:55

Nahoře ve View je uvedeno

@using (Html.BeginForm())
   {

a to je právě to, co způsobuje odeslání formuláře, resp. to zajišťuje fungování toho, co máš v Controlleru pod tou akcí se stejným jménem (jen je u toho atribut "Httppost")

Odpovědět 26.11.2017 9:55
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Fenrix
Člen
Avatar
 
Odpovědět 26.11.2017 13:41
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 32 zpráv z 32.