Přidání nového pole do modelu a databázové tabulky Movie (VB)
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ů:
- Požadavky pro Visual Studio Web Developer Express SP1
- aktualizace nástrojů ASP.NET MVC 3
- SQL Server Compact 4.0 (podpora modulu runtime a nástrojů)
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:
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:
- 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!
- 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.
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:
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ů:
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.