Přidání nového pole do modelu a tabulky Movie

Rick Anderson

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.

Snímek obrazovky s oknem Průzkumníka serveru V místní nabídce Video D B je vybraná možnost Odstranit.

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ů.

Snímek obrazovky s oknem Průzkumník řešení Možnost Odstranit je vybraná v nabídce Filmy m d f kliknutí pravým tlačítkem myši.

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ů.

Přidat člověka s balíčkem

V okně konzoly Správce balíčků na příkazovém PM> řádku zadejte "Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext".

Snímek obrazovky s oknem konzoly Správce balíčků Je zadán příkaz Povolit migrace.

Příkaz Enable-Migrations (viz výše) vytvoří soubor Configuration.cs v nové složce Migrations .

Snímek obrazovky s oknem Průzkumník řešení Složka Migrations a konfigurační soubor c s jsou zakroužkovány červeně.

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;

Snímek obrazovky s vybranou možností Vyřešit v nabídce Po kliknutí pravým tlačítkem myši

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.

Snímek obrazovky s oknem konzoly Správce balíčků Odstavec, který začíná na The Designer Code for this migration file (Kód Designer pro tento soubor migrace, je zvýrazněný.

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 .

Snímek obrazovky s oknem konzoly Správce balíčků Je zadán příkaz update database.

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-databasepří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.

Snímek obrazovky se stránkou Indexu filmů M V C se seznamem čtyř filmů

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:

Snímek obrazovky znázorňující chybu Neplatná výjimka operace byla neošetřená uživatelským kódem.

Snímek obrazovky s oknem prohlížeče s chybou, která uvádí Chybu serveru v aplikaci

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ů:

  1. 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.
  2. 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.
  3. 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).)

Snímek obrazovky znázorňující příkaz update database

Spusťte aplikaci znovu a přejděte na adresu URL /Movies. Zobrazí se nové pole Hodnocení.

Snímek obrazovky zobrazící stránku Index filmů M V C se čtyřmi uvedenými filmy

Kliknutím na odkaz Vytvořit nový přidejte nový film. Všimněte si, že můžete přidat hodnocení.

7_CreateRioII

Klikněte na Vytvořit. Nový film, včetně hodnocení, se teď zobrazí v seznamu filmů:

7_ourNewMovie_SM

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.