Přidání nového pole do modelu a tabulky Movie
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 této části použijete Migrace Entity Framework Code First k migraci některých změn do tříd modelu, aby se změna použila na databázi.
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).
Nastavení Migrace Code First pro změny modelu
Pokud používáte Visual Studio 2012, poklikejte na soubor Movies.mdf z Průzkumník řešení a otevřete nástroj pro databázi. Visual Studio Express pro web zobrazí Průzkumníka databáze, Visual Studio 2012 zobrazí Průzkumníka serveru. Pokud používáte Visual Studio 2010, použijte SQL Server Průzkumník objektů.
V databázovém nástroji (Průzkumník databáze, Průzkumník serveru nebo SQL Server Průzkumník objektů) klikněte pravým tlačítkem myši a MovieDBContext
vyberte Odstranit a přetáhněte databázi filmů.
Přejděte zpět na Průzkumník řešení. Klikněte pravým tlačítkem na soubor Movies.mdf a výběrem možnosti Odstranit odeberte databázi filmů.
Sestavte aplikaci, abyste měli jistotu, že nedošlo k žádným chybám.
V nabídce Nástroje klikněte na Správce balíčků NuGet a pak na Konzola Správce balíčků.
V okně konzoly Správce balíčků na příkazovém PM>
řádku zadejte Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext.
Příkaz Enable-Migrations (viz výše) vytvoří soubor Configuration.cs v nové složce Migrations .
Visual Studio otevře soubor Configuration.cs . Nahraďte metodu Seed
v souboru Configuration.cs následujícím kódem:
protected override void Seed(MvcMovie.Models.MovieDBContext context)
{
context.Movies.AddOrUpdate( i => i.Title,
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
}
Klikněte pravým tlačítkem myši na červenou vlnovku pod Movie
a vyberte Vyřešit a pak použijte MvcMovie.Models;
Tím přidáte následující příkaz using:
using MvcMovie.Models;
Poznámka:
Migrace Code First volá metodu Seed
po každé migraci (tj. volání aktualizační databáze v konzole Správce balíčků) a tato metoda aktualizuje řádky, které už byly vloženy, nebo je vloží, pokud ještě neexistují.
Stisknutím kombinace kláves CTRL-SHIFT-B sestavte projekt.(Následující kroky selžou, pokud se v tomto okamžiku nevytvořijí.)
Dalším krokem je vytvoření DbMigration
třídy pro počáteční migraci. Tato migrace pro vytvoření nové databáze, proto jste odstranili soubor movie.mdf v předchozím kroku.
V okně konzoly Správce balíčků zadejte příkaz "add-migration Initial" a vytvořte počáteční migraci. Název "Počáteční" je libovolný a slouží k pojmenování vytvořeného souboru migrace.
Migrace Code First vytvoří jiný soubor třídy v Složka Migrace (s názvem {DateStamp}_Initial.cs) a tato třída obsahuje kód, který vytvoří schéma databáze. Název souboru migrace je předem opravený časovým razítkem, které vám pomůže se řazením. Prozkoumejte soubor {DateStamp}_Initial.cs, který obsahuje pokyny k vytvoření tabulky Filmy pro Databázi filmů. Při aktualizaci databáze v následujících pokynech se tento soubor {DateStamp}_Initial.cs spustí a vytvoří schéma databáze. Potom se spustí metoda Seed , která naplní databázi testovacími daty.
V konzole Správce balíčků zadejte příkaz "update-database" a vytvořte databázi a spusťte metodu Seed.
Pokud se zobrazí chyba, která značí, že tabulka již existuje a nelze ji vytvořit, pravděpodobně proto, že jste aplikaci spustili po odstranění databáze a před spuštěním update-database
. V takovém případě odstraňte soubor Movies.mdf znovu a zkuste update-database
příkaz zopakovat. Pokud se vám stále zobrazuje chyba, odstraňte složku a obsah migrace a začněte pokyny v horní části této stránky (tím odstraníte soubor Movies.mdf a pak pokračujte k povolení migrace).
Spusťte aplikaci a přejděte na adresu URL /Movies . Zobrazí se počáteční data.
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 Models\Movie.cs a přidejte Rating
tuto vlastnost:
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; }
}
Sestavte aplikaci pomocí příkazu nabídky Sestavit>film nebo stisknutím kombinace kláves CTRL-SHIFT-B.
Teď, když jste aktualizovali Model
třídu, musíte aktualizovat také šablony zobrazení \Views\Movies\Index.cshtml a \Views\Movies\Create.cshtml , aby se nová Rating
vlastnost zobrazila v zobrazení prohlížeče.
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á:
@model IEnumerable<MvcMovie.Models.Movie>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Rating)
</th>
<th></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", "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>
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 jedna z následujících chyb:
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.)
K vyřešení chyby existuje několik přístupů:
- 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; 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! Použití inicializátoru k automatickému sesílování databáze s testovacími daty je často produktivní způsob vývoje aplikace. Další informace o inicializátorech databází Entity Framework najdete v kurzu ke službě Tom Dykstra ASP.NET MVC/Entity Framework.
- 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.
- K aktualizaci schématu databáze použijte Migrace Code First.
Pro účely tohoto kurzu použijeme Migrace Code First.
Aktualizujte metodu Seed tak, aby poskytovala hodnotu pro nový sloupec. Otevřete Migrations\Configuration.cs soubor a přidejte pole Hodnocení do každého objektu Movie.
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "G",
Price = 7.99M
},
Sestavte řešení a otevřete okno konzoly Správce balíčků a zadejte následující příkaz:
add-migration AddRatingMig
Příkaz add-migration
informuje architekturu migrace, aby prozkoumal aktuální model videa se schématem aktuální databáze filmů a vytvořil potřebný kód pro migraci databáze do nového modelu. AddRatingMig je libovolný a slouží k pojmenování souboru migrace. Je užitečné použít smysluplný název kroku migrace.
Po dokončení tohoto příkazu visual Studio otevře soubor třídy, který definuje novou DbMigration
odvozenou třídu, a v Up
metodě uvidíte kód, který vytvoří nový sloupec.
public partial class AddRatingMig : DbMigration
{
public override void Up()
{
AddColumn("dbo.Movies", "Rating", c => c.String());
}
public override void Down()
{
DropColumn("dbo.Movies", "Rating");
}
}
Sestavte řešení a v okně konzoly Správce balíčků zadejte příkaz update-database.
Následující obrázek ukazuje výstup v okně konzoly Správce balíčků (předpřipravení doplňku AddRatingMig s datem bude jiné.)
Znovu spusťte aplikaci a přejděte na adresu URL /Movies. Zobrazí se nové pole Hodnocení.
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ů:
Měli byste také přidat Rating
pole do šablon zobrazení Upravit, Podrobnosti a SearchIndex.
Do okna konzoly Správce balíčků konzoly můžete znovu zadat příkaz update-database, protože schéma odpovídá modelu.
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.