Sdílet prostřednictvím


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

Rick Anderson

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

Snímek obrazovky s oknem Průzkumníka serveru V místní nabídce Movie D B je vybrána 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 znázorňující okno Průzkumník řešení Možnost Odstranit je vybrána v nabídce Filmy dot m d f po 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 balíčku

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

Snímek obrazovky znázorňující okno konzoly Správce balíčků Zadá se příkaz Povolit migraci.

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

Snímek obrazovky znázorňující okno Průzkumník řešení Složka Migrace a soubor s tečkou konfigurace 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 a pak použijte 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í 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.

Snímek obrazovky znázorňující okno konzoly Správce balíčků Odstavec, který začíná kódem návrháře pro tento soubor migrace, je zvýrazněný.

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.

Snímek obrazovky znázorňující okno konzoly Správce balíčků Zadá se příkaz pro aktualizaci databáze.

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.

Snímek obrazovky znázorňující stránku indexu filmu V 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 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:

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 se stavem Chyba 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. 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.
  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 ručně nebo vytvořením skriptu pro změnu databáze.
  3. 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é.)

Snímek obrazovky znázorňující příkaz pro aktualizaci databáze

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

Snímek obrazovky znázorňující stránku indexu filmu V V C se čtyřmi uvedenými filmy

Kliknutím na odkaz Vytvořit nový přidáte 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í ve výpisu filmů:

7_ourNewMovie_SM

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.