Vytvoření tříd modelu v sadě Entity Framework (C#)
od Microsoftu
V tomto kurzu se naučíte používat ASP.NET MVC s rozhraním Microsoft Entity Framework. 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 vytvořit 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 vybírat, vkládat, aktualizovat a odstraňovat záznamy databáze.
Microsoft Entity Framework je nástroj objektového relačního mapování (O/RM), který umožňuje automaticky vygenerovat vrstvu přístupu k datům z databáze. Entity Framework vám umožní vyhnout se zdlouhavé práci při ručním sestavování tříd přístupu k datům.
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í zobrazovat a upravovat 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 entity Framework používat, 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:
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.
Vytvoření ukázkové databáze videa
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 pomocí následujícího postupu:
- V okně Průzkumník řešení klikněte pravým tlačítkem na složku App_Data a vyberte možnost nabídky Přidat, Nová položka.
- V dialogovém okně Přidat novou položku vyberte SQL Server Database, pojmenujte databázi MoviesDB.mdf a klikněte na tlačítko Přidat.
- Poklikáním na soubor MoviesDB.mdf otevřete okno Průzkumník serveru nebo Průzkumník databáze.
- 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.
- V tabulce Designer přidejte sloupce Id, Title a Director.
- Kliknutím na tlačítko Uložit (obsahuje ikonu diskety) uložte novou tabulku s názvem Filmy.
Po vytvoření databázové tabulky Movies byste do této tabulky měli přidat ukázková data. Klikněte pravým tlačítkem myši na tabulku Filmy a vyberte možnost nabídky Zobrazit data tabulky. Do mřížky, která se zobrazí, můžete zadat falešná filmová data.
Vytvoření modelu ADO.NET Entity Data Model
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 Data Model sady Visual Studio.
Postupujte takto:
- V okně Průzkumník řešení klikněte pravým tlačítkem na složku Models a vyberte možnost nabídky Přidat, Nová položka.
- V dialogovém okně Přidat novou položku vyberte kategorii Data (viz Obrázek 1).
- Vyberte šablonu ADO.NET Entity Data Model , dejte modelu Entity Data Model 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.
- V kroku Zvolit obsah modelu zvolte možnost Vygenerovat z databáze a klikněte na tlačítko Další (viz obrázek 2).
- V kroku Zvolte datové připojení vyberte připojení k databázi MoviesDB.mdf, zadejte nastavení připojení entit s názvem MoviesDBEntities a klikněte na tlačítko Další (viz Obrázek 3).
- 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 Designer ADO.NET Entity Data Model (Entity Designer).
Obrázek 1 – Vytvoření nového modelu Entity Data Model
Obrázek 2 – Výběr kroku obsahu modelu
Obrázek 3 – Volba datového připojení
Obrázek 4 – Volba databázových objektů
Úprava modelu ADO.NET Entity Data Model
Po vytvoření modelu Entity Data Model můžete model upravit tak, že využijete Designer entity (viz obrázek 5). Designer entit 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 modelu ADO.NET Entity Data Model
Pomocí Designer entit můžete například změnit názvy tříd, které generuje Průvodce daty modelu entit. Průvodce vytvořil novou třídu přístupu k datům s názvem Movies. 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
Po provedení změn nezapomeňte datový model entity uložit kliknutím na tlačítko Uložit (ikona diskety). Entity Designer na pozadí generuje sadu tříd jazyka C#. Tyto třídy můžete zobrazit otevřením modelu MoviesDBModel. Designer.cs z okna Průzkumník řešení.
Neupravujte kód v souboru Designer.cs, protože změny se při příštím použití entity Designer přepíšou. Pokud chcete rozšířit funkčnost tříd entit definovaných v souboru Designer.cs, můžete vytvořit částečné třídy v samostatných souborech.
Výběr databázových záznamů pomocí Entity Frameworku
Pojďme se pustit do vytváření aplikace 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 Framework.
Výpis 1 – Controllers\HomeController.cs
using System.Linq;
using System.Web.Mvc;
using MovieEntityApp.Models;
namespace MovieEntityApp.Controllers
{
[HandleError]
public class HomeController : Controller
{
MoviesDBEntities _db;
public HomeController()
{
_db = new MoviesDBEntities();
}
public ActionResult Index()
{
ViewData.Model = _db.MovieSet.ToList();
return View();
}
}
}
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 vygenerované entity Designer.
Pokud chcete použít tříduMoviesDBEntities v kontroleru Home, musíte importovat obor názvů MovieEntityApp.Models (MVCProjectName. Modely).
Pole _db slouží 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. ToList() Metoda se používá k převodu sady filmů na obecnou kolekci objektů Movie (List<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="C#"
Inherits="System.Web.Mvc.ViewPage<List<MovieEntityApp.Models.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>
<% foreach (var m in ViewData.Model)
{ %>
Title: <%= m.Title %>
<br />
Director: <%= m.Director %>
<br />
<%= Html.ActionLink("Edit", "Edit", new { id = m.Id })%>
<%= Html.ActionLink("Delete", "Delete", new { id = m.Id })%>
<hr />
<% } %>
<%= Html.ActionLink("Add Movie", "Add") %>
</div>
</body>
</html>
Zobrazení ve výpisu 2 obsahuje smyčku foreach , která prochází jednotlivé filmové záznamy a zobrazuje hodnoty vlastností Název a Režie záznamu filmu. 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
Indexové zobrazení je typové zobrazení. Indexové zobrazení obsahuje <%@ Page %> direktivu s atributem Inherits , který přetypuje vlastnost Model na obecnou kolekci objektů Movie se silnými typy List (List<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.cs (přidání metod)
public ActionResult Add()
{
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(FormCollection form)
{
var movieToAdd = new Movie();
// Deserialize (Include white list!)
TryUpdateModel(movieToAdd, new string[] { "Title", "Director" }, form.ToValueProvider());
// Validate
if (String.IsNullOrEmpty(movieToAdd.Title))
ModelState.AddModelError("Title", "Title is required!");
if (String.IsNullOrEmpty(movieToAdd.Director))
ModelState.AddModelError("Director", "Director is required!");
// If valid, save movie to database
if (ModelState.IsValid)
{
_db.AddToMovieSet(movieToAdd);
_db.SaveChanges();
return RedirectToAction("Index");
}
// Otherwise, reshow form
return View(movieToAdd);
}
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í
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.cs (metody Edit)
public ActionResult Edit(int id)
{
// Get movie to update
var movieToUpdate = _db.MovieSet.First(m => m.Id == id);
ViewData.Model = movieToUpdate;
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(FormCollection form)
{
// Get movie to update
var id = Int32.Parse(form["id"]);
var movieToUpdate = _db.MovieSet.First(m => m.Id == id);
// Deserialize (Include white list!)
TryUpdateModel(movieToUpdate, new string[] { "Title", "Director" }, form.ToValueProvider());
// Validate
if (String.IsNullOrEmpty(movieToUpdate.Title))
ModelState.AddModelError("Title", "Title is required!");
if (String.IsNullOrEmpty(movieToUpdate.Director))
ModelState.AddModelError("Director", "Director is required!");
// If valid, save movie to database
if (ModelState.IsValid)
{
_db.SaveChanges();
return RedirectToAction("Index");
}
// Otherwise, reshow form
return View(movieToUpdate);
}
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:
var movieToUpdate = _db.MovieSet.First(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="C#"
Inherits="System.Web.Mvc.ViewPage<MovieEntityApp.Models.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>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.cs (akce odstranění)
public ActionResult Delete(int id)
{
// Get movie to delete
var movieToDelete = _db.MovieSet.First(m => m.Id == id);
// Delete
_db.DeleteObject(movieToDelete);
_db.SaveChanges();
// Show Index view
return RedirectToAction("Index");
}
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ů.