Vytvoření tříd modelu v sadě Entity Framework (VB)

od Microsoftu

V tomto kurzu se naučíte používat ASP.NET MVC s Microsoft Entity Frameworkem. Naučíte se používat Průvodce entitou k vytvoření modelu ADO.NET Entity Data Model. V průběhu tohoto kurzu vytvoříme webovou aplikaci, která ukazuje, jak vybrat, vložit, aktualizovat a odstranit data databáze pomocí Entity Frameworku.

Cílem tohoto kurzu je vysvětlit, jak můžete při vytváření aplikace ASP.NET MVC vytvářet třídy přístupu k datům pomocí rozhraní Microsoft Entity Framework. Tento kurz nepředpokládá žádné předchozí znalosti rozhraní Microsoft Entity Framework. Na konci tohoto kurzu pochopíte, jak pomocí Entity Frameworku vybrat, vložit, aktualizovat a odstranit záznamy databáze.

Microsoft Entity Framework je nástroj pro relační mapování objektů (O/RM), který umožňuje automaticky vygenerovat vrstvu přístupu k datům z databáze. Entity Framework umožňuje vyhnout se zdlouhavé práci při ručním sestavování tříd přístupu k datům.

Poznámka

Mezi ASP.NET MVC a Rozhraním Microsoft Entity Framework neexistuje žádné základní propojení. Existuje několik alternativ k Rozhraní Entity Framework, které můžete použít s ASP.NET MVC. Můžete například sestavit třídy modelu MVC pomocí jiných nástrojů O/RM, jako jsou Microsoft LINQ to SQL, NHibernate nebo SubSonic.

Abychom si ukázali, jak můžete používat Microsoft Entity Framework s ASP.NET MVC, vytvoříme jednoduchou ukázkovou aplikaci. Vytvoříme aplikaci Movie Database, která vám umožní zobrazit a upravit záznamy filmové databáze.

Tento kurz předpokládá, že máte Visual Studio 2008 nebo Visual Web Developer 2008 s aktualizací Service Pack 1. Abyste mohli používat Entity Framework, potřebujete Service Pack 1. Visual Studio 2008 Service Pack 1 nebo Visual Web Developer s aktualizací Service Pack 1 si můžete stáhnout z následující adresy:

https://www.asp.net/downloads/

Vytvoření ukázkové databáze filmů

Aplikace Movie Database používá databázovou tabulku s názvem Filmy, která obsahuje následující sloupce:

Název sloupce Typ dat Povolit hodnoty Null? Je primární klíč?
Id int Nepravda Ano
Nadpis nvarchar(100) Nepravda Nepravda
Ředitel nvarchar(100) Nepravda Nepravda

Tuto tabulku můžete přidat do projektu ASP.NET MVC následujícím postupem:

  1. Klikněte pravým tlačítkem na složku App_Data v okně Průzkumník řešení a vyberte možnost nabídky Přidat, Nová položka.
  2. V dialogovém okně Přidat novou položku vyberte SQL Server Databáze, pojmenujte databázi MoviesDB.mdf a klikněte na tlačítko Přidat.
  3. Poklikáním na soubor MoviesDB.mdf otevřete okno Průzkumník serveru nebo Průzkumník databáze.
  4. Rozbalte připojení k databázi MoviesDB.mdf, klikněte pravým tlačítkem na složku Tabulky a vyberte možnost nabídky Přidat novou tabulku.
  5. Do Designer tabulky přidejte sloupce Id, Title a Director.
  6. Kliknutím na tlačítko Uložit (má ikonu diskety) uložte novou tabulku s názvem Filmy.

Po vytvoření tabulky databáze Movies byste do tabulky měli přidat ukázková data. Klikněte pravým tlačítkem na tabulku Filmy a vyberte možnost nabídky Zobrazit data tabulky. Do mřížky, která se zobrazí, můžete zadat falešná data filmů.

Vytvoření datového modelu entity ADO.NET

Pokud chcete používat Entity Framework, musíte vytvořit model Entity Data Model. K automatickému vygenerování modelu Entity Data Model z databáze můžete využít Průvodce modelem entity Entity Data Model .

Postupujte takto:

  1. V okně Průzkumník řešení klikněte pravým tlačítkem na složku Modely a vyberte možnost nabídky Přidat, Nová položka.
  2. V dialogovém okně Přidat novou položku vyberte kategorii Data (viz Obrázek 1).
  3. Vyberte šablonu ADO.NET Entity Data Model , pojmenujte Model dat entity název MoviesDBModel.edmx a klikněte na tlačítko Přidat . Kliknutím na tlačítko Přidat spustíte Průvodce datovým modelem.
  4. V kroku Zvolit obsah modelu zvolte možnost Generovat z databáze a klikněte na tlačítko Další (viz Obrázek 2).
  5. V kroku Zvolte datové připojení vyberte připojení k databázi MoviesDB.mdf, zadejte název nastavení připojení entit MoviesDBEntities a klikněte na tlačítko Další (viz Obrázek 3).
  6. V kroku Zvolte databázové objekty vyberte tabulku databáze Movie a klikněte na tlačítko Dokončit (viz Obrázek 4).

Po dokončení těchto kroků se otevře ADO.NET Entity Data Model Designer (Entity Designer).

Obrázek 1 – Vytvoření nového datového modelu entity

clip_image002

Obrázek 2 – Výběr kroku obsahu modelu

clip_image004

Obrázek 3 – Volba datového připojení

clip_image006

Obrázek 4 – Volba databázových objektů

clip_image008

Úprava datového modelu entity ADO.NET

Po vytvoření modelu Entity Data Model můžete model upravit pomocí Designer entity (viz obrázek 5). Designer entity můžete kdykoli otevřít poklikáním na soubor MoviesDBModel.edmx obsažený ve složce Models v okně Průzkumník řešení.

Obrázek 5 – Designer ADO.NET Entity Data Model

clip_image010

Můžete například použít entity Designer ke změně názvů tříd, které generuje Průvodce daty modelu entity. Průvodce vytvořil novou třídu přístupu k datům s názvem Filmy. Jinými slovy, Průvodce dal třídě stejný název jako tabulka databáze. Vzhledem k tomu, že tuto třídu použijeme k reprezentaci konkrétní instance Movie, měli bychom přejmenovat třídu z Movies na Movie.

Pokud chcete přejmenovat třídu entity, můžete dvakrát kliknout na název třídy v Designer Entity a zadat nový název (viz Obrázek 6). Případně můžete změnit název entity v okno Vlastnosti po výběru entity v Designer Entity.

Obrázek 6 – Změna názvu entity

clip_image012

Po provedení úprav nezapomeňte datový model entity uložit kliknutím na tlačítko Uložit (ikona diskety). Na pozadí entity Designer generuje sadu tříd Visual Basic .NET. Tyto třídy můžete zobrazit otevřením modelu MoviesDBModel. Designer.vb z okna Průzkumník řešení.

Neupravujte kód v souboru Designer.vb, protože při příštím použití entity Designer se změny přepíšou. Pokud chcete rozšířit funkčnost tříd entit definovaných v souboru Designer.vb, můžete vytvořit částečné třídy v samostatných souborech.

Výběr databázových záznamů pomocí Entity Frameworku

Začněme vytvářet aplikaci Movie Database vytvořením stránky, která zobrazuje seznam záznamů filmů. Kontroler Home ve výpisu 1 zveřejňuje akci s názvem Index(). Akce Index() vrátí všechny filmové záznamy z tabulky databáze Movie s využitím Entity Frameworku.

Výpis 1 – Controllers\HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Private _db As MoviesDBEntities

    Public Sub New()
        _db = New MoviesDBEntities()
    End Sub

    Public Function Index()
        ViewData.Model = _db.MovieSet.ToList()
        Return View()
    End Function

End Class

Všimněte si, že kontroler v seznamu 1 obsahuje konstruktor. Konstruktor inicializuje pole na úrovni třídy s názvem _db. Pole _db představuje databázové entity vygenerované rozhraním Microsoft Entity Framework. Pole _db je instancí třídy MoviesDBEntities, která byla generována entitou Designer.

Pole _db se používá v rámci akce Index() k načtení záznamů z tabulky databáze Filmy. Výraz _db. MovieSet představuje všechny záznamy z tabulky databáze Movies. Metoda ToList() slouží k převodu sady filmů na obecnou kolekci objektů Movie: List( Of Movie).

Filmové záznamy se načítají pomocí LINQ to Entities. Akce Index() ve výpisu 1 používá syntaxi metody LINQ k načtení sady záznamů databáze. Pokud chcete, můžete místo toho použít syntaxi dotazů LINQ. Následující dva příkazy dělají totéž:

ViewData.Model = _db.MovieSet.ToList()
ViewData.Model = (from m in _db.MovieSet select m).ToList()

Použijte syntaxi LINQ (syntaxi metody nebo syntaxi dotazu), která je pro vás nejintuitivnější. Mezi těmito dvěma přístupy není žádný rozdíl ve výkonu – jediný rozdíl je ve stylu.

Zobrazení v seznamu 2 slouží k zobrazení záznamů filmů.

Výpis 2 – Views\Home\Index.aspx

<%@ Page Language="VB" 
  Inherits="System.Web.Mvc.ViewPage(Of List(Of MvcApplication1.Movie))" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Index</title>
</head>
<body>
    <div>
    
<%  For Each m In Model%>

    Title: <%= m.Title %>
    <br />
    Director: <%= m.Director %>
    <br />
    <%=Html.ActionLink("Edit", "Edit", New With {.id = m.Id})%>
    <%=Html.ActionLink("Delete", "Delete", New With {.id = m.Id})%>
       
        <hr />
<% Next%>
    
    <%= Html.ActionLink("Add Movie", "Add") %>
    
    </div>
</body>
</html>

Zobrazení ve výpisu 2 obsahuje smyčku For Each , která prochází jednotlivé filmové záznamy a zobrazuje hodnoty vlastností filmu Název a Režie. Všimněte si, že vedle každého záznamu se zobrazí odkaz Upravit a Odstranit. V dolní části zobrazení se navíc zobrazí odkaz Přidat video (viz Obrázek 7).

Obrázek 7 – Zobrazení indexu

clip_image014

Indexové zobrazení je typové zobrazení. Zobrazení Index obsahuje <%@ Page %> direktivu, která obsahuje atribut Inherits. Atribut Inherits přetypuje vlastnost ViewData.Model na kolekci objektů Movie se silnými typy List – List(Of Movie).

Vkládání databázových záznamů pomocí Entity Frameworku

Entity Framework vám usnadní vkládání nových záznamů do databázové tabulky. Výpis 3 obsahuje dvě nové akce přidané do třídy Domácí kontroler, které můžete použít k vložení nových záznamů do tabulky databáze Movie.

Výpis 3 – Controllers\HomeController.vb (přidání metod)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Add()
        Return View()
    End Function

    <AcceptVerbs(HttpVerbs.Post)> _
    Public Function Add(ByVal form As FormCollection)
        Dim movieToAdd As New Movie()

        ' Deserialize (Include white list!)
        TryUpdateModel(movieToAdd, New String() {"Title", "Director"}, form.ToValueProvider())

        ' Validate
        If String.IsNullOrEmpty(movieToAdd.Title) Then
            ModelState.AddModelError("Title", "Title is required!")
        End If
        If String.IsNullOrEmpty(movieToAdd.Director) Then
            ModelState.AddModelError("Director", "Director is required!")
        End If

        ' If valid, save movie to database
        If (ModelState.IsValid) Then
            _db.AddToMovieSet(movieToAdd)
            _db.SaveChanges()
            Return RedirectToAction("Index")
        End If

        ' Otherwise, reshow form
        Return View(movieToAdd)
    End Function

End Class

První akce Add() jednoduše vrátí zobrazení. Zobrazení obsahuje formulář pro přidání nového záznamu filmové databáze (viz Obrázek 8). Při odeslání formuláře se vyvolá druhá akce Add().

Všimněte si, že druhá akce Add() je opatřena atributem AcceptVerbs. Tuto akci lze vyvolat pouze při provádění operace HTTP POST. Jinými slovy, tuto akci lze vyvolat pouze při publikování formuláře HTML.

Druhá akce Add() vytvoří novou instanci třídy Entity Framework Movie pomocí metody ASP.NET MVC TryUpdateModel(). Metoda TryUpdateModel() přebírá pole v FormCollection předané metodě Add() a přiřadí hodnoty těchto polí formuláře HTML movie třídy.

Pokud používáte Entity Framework, musíte při použití metod TryUpdateModel nebo UpdateModel k aktualizaci vlastností třídy entity zadat seznam bezpečných vlastností.

Dále akce Přidat() provede jednoduché ověření formuláře. Akce ověří, že vlastnosti Název i Ředitel mají hodnoty. Pokud dojde k chybě ověření, přidá se do funkce ModelState chybová zpráva ověření.

Pokud nedochází k žádným chybám ověřování, přidá se nový záznam filmu do tabulky databáze Movies pomocí Entity Frameworku. Nový záznam se přidá do databáze s následujícími dvěma řádky kódu:

_db.AddToMovieSet(movieToAdd)
_db.SaveChanges()

První řádek kódu přidá novou entitu Film do sady filmů sledovaných rozhraním Entity Framework. Druhý řádek kódu uloží všechny změny provedené ve sledovaných filmech zpět do podkladové databáze.

Obrázek 8 – Přidání zobrazení

clip_image016

Aktualizace databázových záznamů pomocí Entity Frameworku

Při úpravě záznamu databáze můžete s Entity Frameworkem postupovat téměř stejně jako při vkládání nového záznamu databáze. Seznam 4 obsahuje dvě nové akce kontroleru s názvem Edit(). První akce Edit() vrátí formulář HTML pro úpravu filmového záznamu. Druhá akce Edit() se pokusí aktualizovat databázi.

Výpis 4 – Controllers\HomeController.vb (metody Edit)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Edit(ByVal id As Integer)
        ' Get movie to update
        Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)
        ViewData.Model = movieToUpdate
        Return View()
    End Function

    <AcceptVerbs(HttpVerbs.Post)> _
    Public Function Edit(ByVal form As FormCollection)

        ' Get movie to update
        Dim id As Integer = Integer.Parse(form("id"))
        Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)

        ' Deserialize (Include white list!)
        TryUpdateModel(movieToUpdate, New String() {"Title", "Director"}, form.ToValueProvider)

        ' Validate
        If String.IsNullOrEmpty(movieToUpdate.Title) Then
            ModelState.AddModelError("Title", "Title is required!")
        End If
        If String.IsNullOrEmpty(movieToUpdate.Director) Then
            ModelState.AddModelError("Director", "Director is required!")
        End If

        ' If valid, save movie to database
        If (ModelState.IsValid) Then
            _db.SaveChanges()
            Return RedirectToAction("Index")
        End If

        ' Otherwise, reshow form
        Return View(movieToUpdate)
    End Function

End Class

Druhá akce Edit() začíná načtením záznamu Filmu z databáze, který odpovídá ID upravovaného videa. Následující příkaz LINQ to Entities vezme první záznam databáze, který odpovídá konkrétnímu ID:

Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)

Dále metoda TryUpdateModel() slouží k přiřazení hodnot polí formuláře HTML k vlastnostem entity filmu. Všimněte si, že je zadaný seznam bezpečných adres, který určuje přesné vlastnosti, které se mají aktualizovat.

Dále se provede jednoduché ověření, které ověří, že vlastnosti Název filmu i Režie mají hodnoty. Pokud některé z vlastností chybí hodnota, pak se do ModelState a ModelState.IsValid přidá chybová zpráva ověření a vrátí hodnotu false.

A konečně, pokud nedojde k žádným chybám ověřování, podkladová tabulka databáze Movies se aktualizuje o všechny změny voláním metody SaveChanges().

Při úpravách záznamů databáze musíte předat ID upravovaného záznamu akci kontroleru, který provádí aktualizaci databáze. V opačném případě akce kontroleru nebude vědět, který záznam má v podkladové databázi aktualizovat. Zobrazení pro úpravy obsažené ve výpisu 5 obsahuje skryté pole formuláře, které představuje ID upravovaného záznamu databáze.

Výpis 5 – Views\Home\Edit.aspx

<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage(Of MvcApplication1.Movie)" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Edit</title>
    <style type="text/css">
    
    .input-validation-error
    {
        background-color:Yellow;
    }
    
    </style>    
</head>
<body>
    <div>

<h1>Edit Movie</h1>

<form method="post" action="/Home/Edit">

    <!-- Include Hidden Id -->
    <%= Html.Hidden("id") %>

    Title:
    <br />
    <%= Html.TextBox("title") %>
    
    <br /><br />
    Director:
    <br />
    <%= Html.TextBox("director") %>
    
    <br /><br />
    <input type="submit" value="Edit Movie" />
</form>
    
    </div>
</body>
</html>

Odstraňování databázových záznamů pomocí Entity Frameworku

Poslední databázová operace, kterou musíme v tomto kurzu vyřešit, je odstranění záznamů databáze. Akci kontroleru ve výpisu 6 můžete použít k odstranění konkrétního záznamu databáze.

Výpis 6 – \Controllers\HomeController.vb (akce odstranění)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Delete(ByVal id As Integer)
        ' Get movie to delete
        Dim movieToDelete As Movie = _db.MovieSet.First(Function(m) m.Id = id)

        ' Delete 
        _db.DeleteObject(movieToDelete)
        _db.SaveChanges()

        ' Show Index view
        Return RedirectToAction("Index")
    End Function

End Class

Akce Odstranit() nejprve načte entitu Video, která odpovídá ID předané akci. Dále je video odstraněno z databáze voláním metody DeleteObject() následované metodou SaveChanges(). Nakonec se uživatel přesměruje zpět do zobrazení Index.

Souhrn

Účelem tohoto kurzu bylo předvést, jak můžete vytvářet databázemi řízené webové aplikace s využitím ASP.NET MVC a Rozhraní Microsoft Entity Framework. Naučili jste se vytvořit aplikaci, která umožňuje vybírat, vkládat, aktualizovat a odstraňovat databázové záznamy.

Nejprve jsme probrali, jak můžete pomocí Průvodce modelem dat entity vygenerovat model Entity Data Model ze sady Visual Studio. Dále se dozvíte, jak pomocí LINQ to Entities načíst sadu databázových záznamů z databázové tabulky. Nakonec jsme použili Entity Framework k vložení, aktualizaci a odstranění databázových záznamů.