Přidání nového pole do modelu a tabulky Movie (C#)
Poznámka:
Aktualizovaná verze tohoto kurzu je k dispozici zde , která používá ASP.NET MVC 5 a Visual Studio 2013. Je bezpečnější, mnohem jednodušší sledovat a demonstrovat další funkce.
V tomto kurzu se naučíte základy vytváření webové aplikace ASP.NET MVC pomocí sady Microsoft Visual Web Developer 2010 Express Service Pack 1, což je bezplatná verze sady Microsoft Visual Studio. Než začnete, ujistěte se, že jste nainstalovali níže uvedené požadavky. Všechny z nich můžete nainstalovat kliknutím na následující odkaz: Instalační program webové platformy. Případně můžete jednotlivé požadavky nainstalovat pomocí následujících odkazů:
- Požadavky pro Visual Studio Web Developer Express SP1
- aktualizace nástrojů ASP.NET MVC 3
- SQL Server Compact 4.0 (podpora modulu runtime a nástrojů)
Pokud používáte Sadu Visual Studio 2010 místo visual web developeru 2010, nainstalujte požadované součásti kliknutím na následující odkaz: Požadavky sady Visual Studio 2010.
K tomuto tématu je k dispozici projekt Visual Web Developer se zdrojovým kódem jazyka C#. Stáhněte si verzi jazyka C#. Pokud dáváte přednost jazyku Visual Basic, přepněte do verze jazyka Visual Basic tohoto kurzu.
V této části provedete některé změny tříd modelu a dozvíte se, jak aktualizovat schéma databáze tak, aby odpovídalo změnám modelu.
Přidání vlastnosti hodnocení do filmového modelu
Začněte přidáním nové Rating
vlastnosti do existující Movie
třídy. Otevřete soubor Movie.cs a přidejte Rating
vlastnost takto:
public string Rating { get; set; }
Úplná Movie
třída teď vypadá jako následující kód:
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
public string Rating { get; set; }
}
Znovu zkompilujte aplikaci pomocí příkazu nabídky Ladicí>build movie.
Teď, když jste aktualizovali Model
třídu, musíte také aktualizovat šablony zobrazení \Views\Movies\Index.cshtml a \Views\Movies\Create.cshtml , aby bylo možné podporovat novou Rating
vlastnost.
Otevřete soubor \Views\Movies\Index.cshtml a přidejte <th>Rating</th>
záhlaví sloupce hned za sloupec Cena. Potom přidejte <td>
sloupec na konec šablony, který hodnotu vykreslí @item.Rating
. Níže je vidět, jak aktualizovaná šablona zobrazení Index.cshtml vypadá:
<table>
<tr>
<th></th>
<th>Title</th>
<th>Release Date</th>
<th>Genre</th>
<th>Price</th>
<th>Rating</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.DisplayFor(modelItem => item.Rating )
</td>
<td>
@Html.ActionLink("Edit Me", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}
</table>
Dále otevřete soubor \Views\Movies\Create.cshtml a na konec formuláře přidejte následující kód. Tím se vykreslí textové pole, abyste mohli určit hodnocení při vytvoření nového filmu.
<div class="editor-label">
@Html.LabelFor(model => model.Rating)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Rating)
@Html.ValidationMessageFor(model => model.Rating)
</div>
Správa rozdílů ve schématu modelu a databáze
Aktualizovali jste kód aplikace tak, aby podporoval novou Rating
vlastnost.
Teď spusťte aplikaci a přejděte na adresu URL /Movies . Když to ale uděláte, zobrazí se následující chyba:
Tato chyba se zobrazuje, protože aktualizovaná Movie
třída modelu v aplikaci se teď liší od schématu Movie
tabulky existující databáze. (V tabulce databáze není žádný Rating
sloupec.)
Když ve výchozím nastavení použijete Entity Framework Code First k automatickému vytvoření databáze, jak jste to udělali dříve v tomto kurzu, Code First přidá do databáze tabulku, která pomáhá sledovat, jestli je schéma databáze synchronizované se třídami modelu, ze které byla vygenerována. Pokud nejsou synchronizované, Entity Framework vyvolá chybu. To usnadňuje sledování problémů v době vývoje, které byste jinak mohli v době běhu jenom najít (nejasnými chybami). Funkce pro kontrolu synchronizace způsobuje zobrazení chybové zprávy, kterou jste právě viděli.
K vyřešení chyby existují dva přístupy:
- Rozhraní Entity Framework automaticky vyřaďte a znovu vytvořte databázi na základě nového schématu třídy modelu. Tento přístup je velmi pohodlný při aktivním vývoji v testovací databázi, protože umožňuje rychle vyvíjet schéma modelu a databáze společně. Nevýhodou ale je, že ztratíte stávající data v databázi , takže tento přístup nechcete používat v produkční databázi!
- Explicitně upravte schéma existující databáze tak, aby odpovídalo třídám modelu. Výhodou tohoto přístupu je, že data uchováváte. Tuto změnu můžete provést ručně nebo vytvořením skriptu pro změnu databáze.
V tomto kurzu použijeme první přístup – budete mít Entity Framework Code First automaticky znovu vytvořit databázi, kdykoli se model změní.
Automatické opětovné vytvoření databáze při změnách modelu
Pojďme aplikaci aktualizovat tak, aby Code First automaticky zahodí a znovu vytvořil databázi, kdykoli změníte model aplikace.
Poznámka:
Upozornění: Měli byste povolit tento přístup automatického vyřazení a opětovného vytvoření databáze pouze v případě, že používáte vývojovou nebo testovací databázi, a nikdy v produkční databázi, která obsahuje skutečná data. Použití na produkčním serveru může vést ke ztrátě dat.
V Průzkumník řešení klikněte pravým tlačítkem na složku Modely, vyberte Přidat a pak vyberte Třída.
Pojmenujte třídu MovieInitializer. MovieInitializer
Aktualizujte třídu tak, aby obsahovala následující kód:
using System;
using System.Collections.Generic;
using System.Data.Entity;
namespace MvcMovie.Models {
public class MovieInitializer : DropCreateDatabaseIfModelChanges<MovieDBContext> {
protected override void Seed(MovieDBContext context) {
var movies = new List<Movie> {
new Movie { Title = "When Harry Met Sally",
ReleaseDate=DateTime.Parse("1989-1-11"),
Genre="Romantic Comedy",
Rating="R",
Price=7.99M},
new Movie { Title = "Ghostbusters ",
ReleaseDate=DateTime.Parse("1984-3-13"),
Genre="Comedy",
Rating="R",
Price=8.99M},
new Movie { Title = "Ghostbusters 2",
ReleaseDate=DateTime.Parse("1986-2-23"),
Genre="Comedy",
Rating="R",
Price=9.99M},
new Movie { Title = "Rio Bravo",
ReleaseDate=DateTime.Parse("1959-4-15"),
Genre="Western",
Rating="R",
Price=3.99M},
};
movies.ForEach(d => context.Movies.Add(d));
}
}
}
Třída MovieInitializer
určuje, že databáze používaná modelem by se měla vynechat a automaticky znovu vytvořit, pokud se třídy modelu někdy změní. Kód obsahuje metodu Seed
pro určení některých výchozích dat, která se mají automaticky přidat do databáze při každém vytvoření (nebo opětovném vytvoření). To poskytuje užitečný způsob, jak naplnit databázi některými ukázkovými daty, aniž byste ji museli ručně naplnit při každé změně modelu.
Teď, když jste definovali MovieInitializer
třídu, budete ji chtít připojit, aby se při každém spuštění aplikace kontrolují, jestli se třídy modelu liší od schématu v databázi. Pokud ano, můžete inicializátor spustit a znovu vytvořit databázi tak, aby odpovídala modelu, a pak databázi naplnit ukázkovými daty.
Otevřete soubor Global.asax, který je v kořenovém adresáři MvcMovies
projektu:
Soubor Global.asax obsahuje třídu, která definuje celou aplikaci pro projekt a obsahuje obslužnou Application_Start
rutinu události, která se spustí při prvním spuštění aplikace.
Pojďme na začátek souboru přidat dva příkazy using. První odkazuje na obor názvů Entity Framework a druhý odkazuje na obor názvů, ve kterém naše MovieInitializer
třída žije:
using System.Data.Entity; // Database.SetInitialize
using MvcMovie.Models; // MovieInitializer
Pak vyhledejte metodu Application_Start
a přidejte volání Database.SetInitializer
na začátek metody, jak je znázorněno níže:
protected void Application_Start()
{
Database.SetInitializer<MovieDBContext>(new MovieInitializer());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
Příkaz Database.SetInitializer
, který jste právě přidali, znamená, že databáze používaná MovieDBContext
instancí by se měla automaticky odstranit a znovu vytvořit, pokud se schéma a databáze neshodují. A jak jste viděli, naplní se také databáze ukázkovými daty zadanými ve MovieInitializer
třídě.
Zavřete soubor Global.asax.
Znovu spusťte aplikaci a přejděte na adresu URL /Movies . Při spuštění aplikace zjistí, že struktura modelu už neodpovídá schématu databáze. Automaticky znovu vytvoří databázi tak, aby odpovídala nové struktuře modelu, a naplní databázi ukázkovými filmy:
Kliknutím na odkaz Vytvořit nový přidáte nový film. Všimněte si, že můžete přidat hodnocení.
Klikněte na Vytvořit. Nový film, včetně hodnocení, se teď zobrazí ve výpisu filmů:
V této části jste viděli, jak můžete upravovat objekty modelu a udržovat databázi synchronizovanou se změnami. Také jste se naučili, jak naplnit nově vytvořenou databázi ukázkovými daty, abyste si mohli vyzkoušet scénáře. Dále se podíváme na to, jak můžete do tříd modelu přidat bohatší logiku ověřování a povolit vynucení některých obchodních pravidel.