Sdílet prostřednictvím


Přidání nového pole do modelu a databázové tabulky Movie (VB)

Rick Anderson

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

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 s VB.NET zdrojovým kódem. Stáhněte si VB.NET verzi. Pokud dáváte přednost jazyku C#, přepněte do verze jazyka C# 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 Property Rating() As String

Úplná Movie třída teď vypadá jako následující kód:

Public Class Movie
    Public Property ID() As Integer
    Public Property Title() As String
    Public Property ReleaseDate() As Date
    Public Property Genre() As String
    Public Property Price() As Decimal
    Public Property Rating() As String
End Class

Znovu zkompilujte aplikaci pomocí příkazu nabídky Ladicí>build movie.

Teď, když jste aktualizovali Model třídu, musíte aktualizovat také šablony zobrazení \Views\Movies\Index.vbhtml a \Views\Movies\Create.vbhtml , aby bylo možné podporovat novou Rating vlastnost.

Otevřete soubor\Views\Movies\Index.vbhtml 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.vbhtml vypadá:

<table>
    <tr>
        <th>            Title        </th>
        <th>            ReleaseDate        </th>
        <th>            Genre        </th>
        <th>            Price        </th>
        <th>Rating</th>
        <th></th>
    </tr>

@For Each item In Model
    Dim currentItem = item
    @<tr>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.Title)
        </td>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.ReleaseDate)
        </td>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.Genre)
        </td>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.Price)
        </td>
         <td>
            @Html.DisplayFor(Function(modelItem) currentItem.Rating)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", New With {.id = currentItem.ID}) |
            @Html.ActionLink("Details", "Details", New With {.id = currentItem.ID}) |
            @Html.ActionLink("Delete", "Delete", New With {.id = currentItem.ID})
        </td>
    </tr>
Next

</table>

Dále otevřete soubor \Views\Movies\Create.vbhtml 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(Function(model) model.Rating)
 </div>
 <div class="editor-field">
     @Html.EditorFor(Function(model) model.Rating)
     @Html.ValidationMessageFor(Function(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:

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

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:

  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, 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!
  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.

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.

Snímek obrazovky znázorňující okno Průzkumník řešení Možnost Přidat je vybrána v nabídce Po kliknutí pravým tlačítkem myši Modely a v dílčí nabídce je vybrána třída.

Pojmenujte třídu MovieInitializer. MovieInitializer Aktualizujte třídu tak, aby obsahovala následující kód:

using System;
Imports System
Imports System.Collections.Generic
Imports System.Data.Entity

Namespace MvcMovie.Models
    Public Class MovieInitializer
        Inherits DropCreateDatabaseIfModelChanges(Of MovieDBContext)
        Protected Overrides Sub Seed(ByVal context As MovieDBContext)
            Dim movies = New List(Of Movie) From {
             New Movie With {.Title = "When Harry Met Sally", .ReleaseDate = Date.Parse("1989-1-11"), .Genre = "Romantic Comedy", .Rating = "R", .Price = 7.99D},
             New Movie With {.Title = "Ghostbusters ", .ReleaseDate = Date.Parse("1984-3-13"), .Genre = "Comedy", .Rating = "R", .Price = 8.99D},
             New Movie With {.Title = "Ghostbusters 2", .ReleaseDate = Date.Parse("1986-2-23"), .Genre = "Comedy", .Rating = "R", .Price = 9.99D},
             New Movie With {.Title = "Rio Bravo", .ReleaseDate = Date.Parse("1959-4-15"), .Genre = "Western", .Rating = "R", .Price = 3.99D}}

            movies.ForEach(Function(d) context.Movies.Add(d))
        End Sub
    End Class
End Namespace

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.

Najděte metodu Application_Start a přidejte volání Database.SetInitializer na začátek metody, jak je znázorněno níže:

Sub Application_Start()
        System.Data.Entity.Database.SetInitializer(Of MovieDBContext)(New MvcMovie.Models.MovieInitializer())
       
        AreaRegistration.RegisterAllAreas()

        RegisterGlobalFilters(GlobalFilters.Filters)
        RegisterRoutes(RouteTable.Routes)
    End Sub

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:

7_MyMovieList_SM

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

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.