Dodawanie nowego pola do modelu Movie i tabeli bazy danych (VB)

Autor : Rick Anderson

Ten samouczek zawiera podstawowe informacje na temat tworzenia aplikacji internetowej MVC ASP.NET przy użyciu programu Microsoft Visual Web Developer 2010 Express z dodatkiem Service Pack 1, który jest bezpłatną wersją programu Microsoft Visual Studio. Przed rozpoczęciem upewnij się, że zostały zainstalowane wymagania wstępne wymienione poniżej. Wszystkie te elementy można zainstalować, klikając następujący link: Instalator platformy sieci Web. Alternatywnie można osobno zainstalować wymagania wstępne, korzystając z następujących linków:

Jeśli używasz programu Visual Studio 2010 zamiast Visual Web Developer 2010, zainstaluj wymagania wstępne, klikając następujący link: Wymagania wstępne programu Visual Studio 2010.

Projekt Visual Web Developer z kodem źródłowym VB.NET jest dostępny do dołączenia do tego tematu. Pobierz wersję VB.NET. Jeśli wolisz język C#, przejdź do wersji języka C# tego samouczka.

W tej sekcji wprowadzisz pewne zmiany w klasach modelu i dowiesz się, jak zaktualizować schemat bazy danych, aby dopasować go do zmian modelu.

Dodawanie właściwości ratingu do modelu filmowego

Zacznij od dodania nowej Rating właściwości do istniejącej Movie klasy. Otwórz plik Movie.cs i dodaj właściwość podobną do następującej Rating :

Public Property Rating() As String

Kompletna Movie klasa wygląda teraz jak następujący kod:

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

Ponownie skompiluj aplikację za pomocą polecenia menu Debuguj>film kompilacji .

Po zaktualizowaniu Model klasy należy również zaktualizować szablony widoków \Views\Movies\Index.vbhtml i \Views\Movies\Create.vbhtml , aby obsługiwać nową Rating właściwość.

Otwórz plik\Views\Movies\Index.vbhtml i dodaj <th>Rating</th> nagłówek kolumny tuż po kolumnie Price . Następnie dodaj kolumnę <td> pod koniec szablonu, aby renderować @item.Rating wartość. Poniżej przedstawiono wygląd zaktualizowanego szablonu widoku Index.vbhtml :

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

Następnie otwórz plik \Views\Movies\Create.vbhtml i dodaj następujący znacznik na końcu formularza. Spowoduje to renderowanie pola tekstowego, aby można było określić ocenę podczas tworzenia nowego 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>

Zarządzanie różnicami modelu i schematu bazy danych

Kod aplikacji został zaktualizowany w celu obsługi nowej Rating właściwości.

Teraz uruchom aplikację i przejdź do adresu URL /Movies . Po wykonaniu tej czynności zostanie wyświetlony następujący błąd:

Zrzut ekranu przedstawiający okno przeglądarki z błędem wskazującym błąd serwera w aplikacji.

Ten błąd występuje, ponieważ zaktualizowana Movie klasa modelu w aplikacji różni się teraz od schematu Movie tabeli istniejącej bazy danych. (Nie ma Rating kolumny w tabeli bazy danych).

Domyślnie, gdy używasz programu Entity Framework Code First do automatycznego tworzenia bazy danych, tak jak wcześniej w tym samouczku, program Code First dodaje tabelę do bazy danych, aby ułatwić śledzenie, czy schemat bazy danych jest zsynchronizowany z klasami modelu, z których została wygenerowana. Jeśli nie są one zsynchronizowane, program Entity Framework zgłasza błąd. Ułatwia to śledzenie problemów w czasie programowania, które w przeciwnym razie można znaleźć tylko (przez niejasne błędy) w czasie wykonywania. Funkcja sprawdzania synchronizacji powoduje wyświetlenie właśnie wyświetlonego komunikatu o błędzie.

Istnieją dwa podejścia do rozwiązywania błędu:

  1. Program Entity Framework automatycznie upuszcza i ponownie tworzy bazę danych na podstawie nowego schematu klasy modelu. Takie podejście jest bardzo wygodne podczas aktywnego programowania w testowej bazie danych, ponieważ umożliwia szybkie rozwijanie modelu i schematu bazy danych. Wadą jest jednak utrata istniejących danych w bazie danych — więc nie chcesz używać tej metody w produkcyjnej bazie danych.
  2. Jawnie zmodyfikuj schemat istniejącej bazy danych, tak aby odpowiadał klasom modelu. Zaletą tego podejścia jest przechowywanie danych. Tę zmianę można wprowadzić ręcznie lub tworząc skrypt zmiany bazy danych.

W tym samouczku użyjemy pierwszego podejścia — będziesz mieć automatycznie ponownie utworzoną bazę danych za każdym razem, gdy model ulegnie zmianie.

Automatyczne Re-Creating zmian w modelu bazy danych

Zaktualizujmy aplikację, aby kod Code First automatycznie spadał i tworzy ponownie bazę danych w dowolnym momencie zmiany modelu dla aplikacji.

Uwaga

Ostrzeżenie Należy włączyć to podejście do automatycznego usuwania i ponownego tworzenia bazy danych tylko wtedy, gdy używasz programowania lub testowej bazy danych, a nigdy w produkcyjnej bazie danych zawierającej rzeczywiste dane. Użycie go na serwerze produkcyjnym może prowadzić do utraty danych.

W Eksplorator rozwiązań kliknij prawym przyciskiem myszy folder Models, wybierz polecenie Dodaj, a następnie wybierz pozycję Klasa.

Zrzut ekranu przedstawiający okno Eksplorator rozwiązań. Opcja Dodaj jest zaznaczona w menu kliknij prawym przyciskiem myszy modele, a w menu podrzędnym jest zaznaczona opcja Klasa.

Nadaj klasie nazwę "MovieInitializer". Zaktualizuj klasę tak MovieInitializer , aby zawierała następujący kod:

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

Klasa MovieInitializer określa, że baza danych używana przez model powinna zostać porzucona i automatycznie utworzona ponownie, jeśli kiedykolwiek zmienią się klasy modelu. Kod zawiera metodę określania Seed domyślnych danych, które mają być automatycznie dodawane do bazy danych w dowolnym momencie utworzenia (lub ponownego utworzenia). Zapewnia to przydatny sposób wypełniania bazy danych przykładowymi danymi bez konieczności ręcznego wypełniania jej za każdym razem, gdy wprowadzasz zmianę modelu.

Po zdefiniowaniu MovieInitializer klasy należy połączyć ją tak, aby za każdym razem, gdy aplikacja działa, sprawdza, czy klasy modeli różnią się od schematu w bazie danych. Jeśli tak, możesz uruchomić inicjator, aby ponownie utworzyć bazę danych w celu dopasowania jej do modelu, a następnie wypełnić bazę danych przykładowymi danymi.

Otwórz plik Global.asax znajdujący się w katalogu głównym MvcMovies projektu:

Plik Global.asax zawiera klasę, która definiuje całą aplikację dla projektu i zawiera procedurę obsługi zdarzeń uruchamianą Application_Start po pierwszym uruchomieniu aplikacji.

Znajdź metodę Application_Start i dodaj wywołanie metody na Database.SetInitializer początku metody, jak pokazano poniżej:

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

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

Właśnie Database.SetInitializer dodana instrukcja wskazuje, że baza danych używana przez MovieDBContext wystąpienie powinna zostać automatycznie usunięta i utworzona ponownie, jeśli schemat i baza danych nie są zgodne. Jak widać, baza danych zostanie również wypełniona przykładowymi danymi określonymi MovieInitializer w klasie.

Zamknij plik Global.asax .

Uruchom ponownie aplikację i przejdź do adresu URL /Movies . Po uruchomieniu aplikacji wykrywa ona, że struktura modelu nie jest już zgodna ze schematem bazy danych. Automatycznie tworzy ponownie bazę danych w celu dopasowania jej do nowej struktury modelu i wypełnia bazę danych przykładowymi filmami:

7_MyMovieList_SM

Kliknij link Utwórz nowy , aby dodać nowy film. Pamiętaj, że można dodać ocenę.

7_CreateRioII

Kliknij pozycję Utwórz. Nowy film, w tym ocena, pojawia się teraz na liście filmów:

7_ourNewMovie_SM

W tej sekcji przedstawiono sposób modyfikowania obiektów modelu i synchronizowania bazy danych ze zmianami. Przedstawiono również sposób wypełniania nowo utworzonej bazy danych przykładowymi danymi, aby można było wypróbować scenariusze. Następnie przyjrzyjmy się, jak można dodać bardziej zaawansowaną logikę walidacji do klas modelu i umożliwić wymuszanie niektórych reguł biznesowych.