Přidání nového pole do modelu a tabulky Movie
Poznámka
Aktualizovaná verze tohoto kurzu je k dispozici tady, která používá ASP.NET MVC 5 a Visual Studio 2013. Je bezpečnější, mnohem jednodušší sledovat a ukazuje více funkcí.
V této části použijete Migrace Entity Framework Code First k migraci některých změn tříd modelu, aby se tato změna použila na databázi.
Když k automatickému vytvoření databáze použijete Entity Framework Code First, 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é s 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 najít (pomocí skryté chyby) pouze za běhu.
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 se zobrazí Průzkumník databáze, Visual Studio 2012 zobrazí Průzkumník 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 na MovieDBContext
a vyberte Odstranit, aby se databáze filmů odstranila.
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 pak pomocí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í update-database 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 se nezdaří, pokud v tomto okamžiku sestavení neprovedete.)
Dalším krokem je vytvoření DbMigration
třídy pro počáteční migraci. Tato migrace vytvoří novou databázi, proto jste soubor movie.mdf odstranili 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 používá se k pojmenování vytvořeného souboru migrace.
Migrace Code First vytvoří další soubor třídy ve složce Migrations (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ý pomocí časového razítka, které pomáhá s řazením. Prohlédněte si soubor {DateStamp}_Initial.cs , který obsahuje pokyny k vytvoření tabulky Movies pro službu Movie DB. Při aktualizaci databáze v následujících pokynech se tento soubor {DateStamp}_Initial.cs spustí a vytvoří schéma databáze. Pak se spustí metoda Seed , která naplní databázi testovacími daty.
V konzole Správce balíčků zadáním příkazu update-database vytvořte databázi a spusťte metodu Seed .
Pokud se zobrazí chyba, která značí, že tabulka již existuje a nelze ji vytvořit, je to pravděpodobně proto, že jste aplikaci spustili po odstranění databáze a před spuštěním update-database
příkazu . V takovém případě znovu odstraňte soubor Movies.mdf a zkuste update-database
příkaz zopakovat. Pokud stále dochází k chybě, odstraňte složku a obsah migrations a začněte pokyny v horní části této stránky (odstraňte soubor Movies.mdf a přejděte na Enable-Migrations).
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 vlastnost, jako Rating
je tato:
public string Rating { get; set; }
Kompletní 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>video sestavení nebo stisknutím kombinace kláves CTRL-SHIFT-B.
Teď, když jste aktualizovali Model
třídu, musíte také aktualizovat š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 Price . Potom přidejte <td>
sloupec na konec šablony pro vykreslení @item.Rating
hodnoty. Aktualizovaná šablona zobrazení Index.cshtml vypadá takto:
@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>
Potom 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, 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ů:
- Nechte Entity Framework automaticky odstranit a znovu vytvořit databázi na základě nového schématu třídy modelu. Tento přístup je velmi vhodný při provádění aktivního vývoje v testovací databázi; umožňuje rychle vyvíjet model a schéma 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 nasazení databáze testovacími daty je často produktivní způsob vývoje aplikace. Další informace o inicializátorech databází Entity Framework najdete v kurzu ASP.NET MVC/Entity Framework od Toma Dykstra.
- 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 buď ručně, nebo vytvořením skriptu pro změnu databáze.
- K aktualizaci schématu databáze použijte Migrace Code First.
V tomto kurzu použijeme Migrace Code First.
Aktualizujte metodu Seed tak, aby poskytovala hodnotu pro nový sloupec. Otevřete soubor Migrations\Configuration.cs a přidejte pole Hodnocení ke každému 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í, otevřete okno konzoly Správce balíčků a zadejte následující příkaz:
add-migration AddRatingMig
Příkaz add-migration
říká architektuře migrace, aby prozkoumala aktuální model filmu s aktuálním schématem databáze filmů a vytvořila kód potřebný k migraci databáze do nového modelu. AddRatingMig je libovolný a používá se k pojmenování souboru migrace. Pro krok migrace je užitečné použít smysluplný název.
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 znázorňuje výstup v okně konzoly Správce balíčků (Razítko s datem addRatingMig se bude lišit).)
Spusťte aplikaci znovu a přejděte na adresu URL /Movies. Zobrazí se nové pole Hodnocení.
Kliknutím na odkaz Vytvořit nový přidejte 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í v seznamu filmů:
Toto pole byste také měli přidat Rating
do šablon zobrazení Upravit, Podrobnosti a SearchIndex.
V okně konzoly Správce balíčků můžete znovu zadat příkaz update-database a nebudou provedeny žádné změny, protože schéma odpovídá modelu.
V této části jste viděli, jak můžete upravit 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. V dalším kroku se podíváme na to, jak můžete do tříd modelu přidat bohatší logiku ověřování a jak povolit vynucování některých obchodních pravidel.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro