Udostępnij za pośrednictwem


Dodawanie nowego pola do modelu Movie i tabeli

Autor: Rick Anderson

Uwaga

Zaktualizowana wersja tego samouczka jest dostępna tutaj , która używa ASP.NET MVC 5 i Visual Studio 2013. Jest bezpieczniejszy, znacznie prostszy do naśladowania i demonstruje więcej funkcji.

W tej sekcji użyjesz migracje Code First platformy Entity Framework, aby przeprowadzić migrację niektórych zmian do klas modelu, dzięki czemu zmiana zostanie zastosowana do bazy danych.

Domyślnie gdy używasz programu Entity Framework Code First do automatycznego tworzenia bazy danych, tak jak wcześniej w tym samouczku, funkcja 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.

Konfigurowanie Migracje Code First zmian modelu

Jeśli używasz programu Visual Studio 2012, kliknij dwukrotnie plik Movies.mdf z Eksplorator rozwiązań, aby otworzyć narzędzie bazy danych. Program Visual Studio Express dla sieci Web wyświetli Eksploratora baz danych, program Visual Studio 2012 wyświetli Eksploratora serwera. Jeśli używasz programu Visual Studio 2010, użyj programu SQL Server Eksplorator obiektów.

W narzędziu bazy danych (Eksplorator bazy danych, Eksplorator serwera lub program SQL Server Eksplorator obiektów) kliknij prawym przyciskiem myszy MovieDBContext i wybierz polecenie Usuń, aby usunąć bazę danych filmów.

Zrzut ekranu przedstawiający okno Eksplorator serwera. Opcja Usuń jest zaznaczona w menu kontekstowym Movie D B.

Wróć do Eksplorator rozwiązań. Kliknij prawym przyciskiem myszy plik Movies.mdf i wybierz polecenie Usuń , aby usunąć bazę danych filmów.

Zrzut ekranu przedstawiający okno Eksplorator rozwiązań. Opcja Usuń jest zaznaczona w menu kliknij prawym przyciskiem myszy pozycję Filmy dot m d f.

Skompiluj aplikację, aby upewnić się, że nie ma żadnych błędów.

W menu Narzędzia kliknij pozycję Menedżer pakietów NuGet, a następnie kliknij pozycję Konsola menedżera pakietów.

Dodawanie dodatku Pack Man

W oknie konsoli Menedżer pakietów po wyświetleniu monitu PM> wprowadź wartość "Enable-Migrations -ContextTypeName MvcFilm.Models.MovieDBContext".

Zrzut ekranu przedstawiający okno konsoli Menedżer pakietów. Wprowadzono polecenie Włącz migracje.

Polecenie Enable-Migrations (pokazane powyżej) tworzy plik Configuration.cs w nowym folderze Migrations .

Zrzut ekranu przedstawiający okno Eksplorator rozwiązań. Folder Migrations i plik Configuration dot c s są zakreśline na czerwono.

Program Visual Studio otwiera plik Configuration.cs . Zastąp metodę Seed w pliku Configuration.cs następującym kodem:

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
       }
   );
   
}

Kliknij prawym przyciskiem myszy czerwony wiersz zquiggly w obszarze Movie , a następnie wybierz pozycję Rozwiąż , a następnie użyj mvcFilm.Models;

Zrzut ekranu przedstawiający opcję Rozwiąż wybraną w menu kliknij prawym przyciskiem myszy film.

Spowoduje to dodanie następującej instrukcji using:

using MvcMovie.Models;

Uwaga

Migracje Code First wywołuje metodę Seed po każdej migracji (czyli wywoływaniu bazy danych update-database w konsoli Menedżer pakietów), a ta metoda aktualizuje wiersze, które zostały już wstawione lub wstawia je, jeśli jeszcze nie istnieją.

Naciśnij CTRL-SHIFT-B, aby skompilować projekt.(Poniższe kroki nie powiedzą się, jeśli nie skompiluj w tym momencie).

Następnym krokiem DbMigration jest utworzenie klasy na potrzeby migracji początkowej. Ta migracja w celu utworzenia nowej bazy danych, dlatego usunięto plik movie.mdf w poprzednim kroku.

W oknie Menedżer pakietów Konsola wprowadź polecenie "add-migration Initial", aby utworzyć migrację początkową. Nazwa "Initial" jest dowolna i służy do nazywania utworzonego pliku migracji.

Zrzut ekranu przedstawiający okno konsoli Menedżer pakietów. Akapit rozpoczynający się od kodu projektanta dla tego pliku migracji jest wyróżniony.

Migracje Code First tworzy inny plik klasy w pliku Folder Migrations (o nazwie {DateStamp}_Initial.cs ), a ta klasa zawiera kod tworzący schemat bazy danych. Nazwa pliku migracji jest wstępnie naprawiona za pomocą znacznika czasu, aby ułatwić zamawianie. Sprawdź plik {DateStamp}_Initial.cs zawierający instrukcje dotyczące tworzenia tabeli Filmy dla bazy danych Movie DB. Po zaktualizowaniu bazy danych w poniższych instrukcjach ten plik _Initial.cs {DateStamp}zostanie uruchomiony i utworzy schemat bazy danych. Następnie zostanie uruchomiona metoda Seed, aby wypełnić bazę danych danymi testowymi.

W konsoli Menedżer pakietów wprowadź polecenie "update-database", aby utworzyć bazę danych i uruchomić metodę Seed.

Zrzut ekranu przedstawiający okno konsoli Menedżer pakietów. Wprowadzono polecenie aktualizacji bazy danych.

Jeśli wystąpi błąd wskazujący, że tabela już istnieje i nie można jej utworzyć, prawdopodobnie dlatego, że aplikacja została uruchomiona po usunięciu bazy danych i przed wykonaniem polecenia update-database. W takim przypadku ponownie usuń plik Movies.mdf i ponów próbę update-database polecenia. Jeśli nadal wystąpi błąd, usuń folder migracji i zawartość, a następnie zacznij od instrukcji w górnej części tej strony (czyli usuń plik Movies.mdf , a następnie przejdź do pozycji Włącz migracje).

Uruchom aplikację i przejdź do adresu URL /Movies . Zostaną wyświetlone dane inicjujne.

Zrzut ekranu przedstawiający stronę indeksu filmów M V C z listą czterech filmów.

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 Models\Movie.cs i dodaj właściwość podobną do następującejRating:

public string Rating { get; set; }

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

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

Skompiluj aplikację przy użyciu polecenia menu Kompiluj >film lub naciskając CTRL-SHIFT-B.

Po zaktualizowaniu Model klasy należy również zaktualizować szablony widoków \Views\Movies\Index.cshtml i \Views\Movies\Create.cshtml , aby wyświetlić nową Rating właściwość w widoku przeglądarki.

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

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

Następnie otwórz plik \Views\Movies\Create.cshtml 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(model => model.Rating)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Rating)
    @Html.ValidationMessageFor(model => model.Rating)
</div>

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

Teraz uruchom aplikację i przejdź do adresu URL /Movies . W takim przypadku zobaczysz jednak jeden z następujących błędów:

Zrzut ekranu przedstawiający błąd Nieprawidłowy wyjątek operacji nieobsługiwany przez kod użytkownika.

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. (W tabeli bazy danych nie Rating ma żadnej kolumny).

Istnieje kilka podejść do rozwiązywania błędu:

  1. Program Entity Framework automatycznie upuść i ponownie utworzyć bazę danych na podstawie nowego schematu klasy modelu. Takie podejście jest bardzo wygodne podczas aktywnego programowania w testowej bazie danych; umożliwia szybkie rozwijanie modelu i schematu bazy danych. Wadą jest jednak utratę istniejących danych w bazie danych — więc nie chcesz używać tego podejścia w produkcyjnej bazie danych. Użycie inicjatora do automatycznego rozmieszczania bazy danych z danymi testowymi jest często produktywnym sposobem tworzenia aplikacji. Aby uzyskać więcej informacji na temat inicjatorów baz danych platformy Entity Framework, zobacz samouczek ASP.NET MVC/Entity Framework firmy Tom Dykstra.
  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.
  3. Użyj Migracje Code First, aby zaktualizować schemat bazy danych.

Na potrzeby tego samouczka użyjemy Migracje Code First.

Zaktualizuj metodę Seed, aby zapewnić jej wartość dla nowej kolumny. Otwórz plik Migrations\Configuration.cs i dodaj pole Ocena do każdego obiektu Movie.

new Movie
{
    Title = "When Harry Met Sally",
    ReleaseDate = DateTime.Parse("1989-1-11"),
    Genre = "Romantic Comedy",
    Rating = "G",
    Price = 7.99M
},

Skompiluj rozwiązanie, a następnie otwórz okno konsoli Menedżer pakietów i wprowadź następujące polecenie:

add-migration AddRatingMig

Polecenie add-migration informuje platformę migracji, aby zbadać bieżący model filmu przy użyciu bieżącego schematu bazy danych filmu i utworzyć niezbędny kod do zmigrowania bazy danych do nowego modelu. Element AddRatingMig jest dowolny i służy do nazywania pliku migracji. Warto użyć znaczącej nazwy dla kroku migracji.

Po zakończeniu tego polecenia program Visual Studio otwiera plik klasy definiujący nową DbMigration klasę pochodną, a w Up metodzie można zobaczyć kod tworzący nową kolumnę.

public partial class AddRatingMig : DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.Movies", "Rating", c => c.String());
    }
    
    public override void Down()
    {
        DropColumn("dbo.Movies", "Rating");
    }
}

Skompiluj rozwiązanie, a następnie wprowadź polecenie "update-database" w oknie konsoli Menedżer pakietów.

Na poniższej ilustracji przedstawiono dane wyjściowe w oknie konsoli Menedżer pakietów (sygnatura daty poprzedzającą dodawanieRatingMig będzie inna).

Zrzut ekranu przedstawiający polecenie aktualizacji bazy danych.

Uruchom ponownie aplikację i przejdź do adresu URL /Movies. Zostanie wyświetlone nowe pole Ocena.

Zrzut ekranu przedstawiający stronę indeksu filmów języka C języka M V z wyświetlonymi czterema filmami.

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

7_CreateRioII

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

7_ourNewMovie_SM

Należy również dodać Rating pole do szablonów widoków Edytowanie, Szczegóły i Indeks wyszukiwania.

Możesz ponownie wprowadzić polecenie "update-database" w oknie konsoli Menedżer pakietów i nie zostaną wprowadzone żadne zmiany, ponieważ schemat jest zgodny z modelem.

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, dzięki czemu można wypróbować scenariusze. Następnie przyjrzyjmy się temu, jak można dodać bogatszą logikę walidacji do klas modeli i umożliwić wymuszanie niektórych reguł biznesowych.