Część 7. Dodawanie nowego pola do Razor strony w ASP.NET Core

Uwaga

Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.

Ważne

Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.

Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.

Autor: Rick Anderson

W tej sekcji program Entity Framework Migracje Code First jest używany do:

  • Dodaj nowe pole do modelu.
  • Przeprowadź migrację zmiany schematu nowego pola do bazy danych.

Jeśli używasz programu EF Code First do automatycznego tworzenia i śledzenia bazy danych, Code First:

  • Dodaje tabelę __EFMigrationsHistory do bazy danych w celu śledzenia, czy schemat bazy danych jest zsynchronizowany z klasami modelu, z których został wygenerowany.
  • Zgłasza wyjątek, jeśli klasy modelu nie są zsynchronizowane z bazą danych.

Automatyczna weryfikacja, czy schemat i model są zsynchronizowane, ułatwia znajdowanie niespójnych problemów z kodem bazy danych.

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

  1. Models/Movie.cs Otwórz plik i dodaj Rating właściwość:

    public class Movie
    {
        public int Id { get; set; }
        public string Title { get; set; } = string.Empty;
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; } = string.Empty;
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; } = string.Empty;
    }
    
  2. Edytuj Pages/Movies/Index.cshtml, i dodaj Rating pole:

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            Title: <input type="text" asp-for="SearchString" />
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <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>
                        <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.Id">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  3. Zaktualizuj następujące strony przy użyciu Rating pola:

Aplikacja nie będzie działać, dopóki baza danych nie zostanie zaktualizowana w celu uwzględnienia nowego pola. Uruchomienie aplikacji bez aktualizacji bazy danych zgłasza błąd SqlException:

SqlException: Invalid column name 'Rating'.

Wyjątek jest spowodowany tym, że zaktualizowana SqlException klasa modelu Movie różni się od schematu tabeli Movie bazy danych. W tabeli bazy danych nie Rating ma żadnej kolumny.

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

  1. Program Entity Framework automatycznie upuszcza i ponownie utwórz bazę danych przy użyciu nowego schematu klasy modelu. Takie podejście jest wygodne na wczesnym etapie cyklu tworzenia, dzięki czemu deweloperzy mogą szybko rozwijać schemat modelu i bazy danych. Wadą jest to, że istniejące dane w bazie danych zostaną utracone. Nie używaj tego podejścia w produkcyjnej bazie danych! Usunięcie bazy danych ze zmianami schematu i użycie inicjatora do automatycznego rozmieszczania bazy danych z danymi testowymi jest często produktywnym sposobem tworzenia aplikacji.
  2. Jawnie zmodyfikuj schemat istniejącej bazy danych, tak aby odpowiadał klasom modelu. Zaletą tego podejścia jest przechowywanie danych. Wprowadź tę zmianę 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żyj Migracje Code First.

Zaktualizuj klasę SeedData , aby zapewnić jej wartość dla nowej kolumny. Poniżej przedstawiono przykładową zmianę, ale wprowadź tę zmianę dla każdego new Movie bloku.

context.Movie.AddRange(
    new Movie
    {
        Title = "When Harry Met Sally",
        ReleaseDate = DateTime.Parse("1989-2-12"),
        Genre = "Romantic Comedy",
        Price = 7.99M,
        Rating = "R"
    },

Zobacz ukończony plik SeedData.cs.

Tworzenie aplikacji

Naciśnij klawisze Ctrl+Shift B+

Dodawanie migracji dla pola klasyfikacji

  1. W menu Narzędzia wybierz pozycję NuGet Menedżer pakietów > konsoli Menedżer pakietów.

  2. W usłudze PMC wprowadź następujące polecenia:

    Add-Migration Rating
    Update-Database
    

Polecenie Add-Migration informuje platformę o następującej liczbie:

  • Movie Porównaj model ze schematem Movie bazy danych.
  • Utwórz kod, aby przeprowadzić migrację schematu bazy danych do nowego modelu.

Nazwa "Ocena" jest dowolna i służy do nazywania pliku migracji. Warto użyć znaczącej nazwy pliku migracji.

Polecenie Update-Database informuje platformę o zastosowaniu zmian schematu w bazie danych i zachowaniu istniejących danych.

Usuń wszystkie rekordy w bazie danych, inicjator zaimekuje bazę danych i dołączy Rating pole. Usuwanie można wykonać za pomocą linków usuwania w przeglądarce lub z programu Sql Server Eksplorator obiektów (SSOX).

Inną opcją jest usunięcie bazy danych i ponowne utworzenie bazy danych przy użyciu migracji. Aby usunąć bazę danych w programie SSOX:

  1. Wybierz bazę danych w programie SSOX.

  2. Kliknij prawym przyciskiem myszy bazę danych i wybierz polecenie Usuń.

  3. Zaznacz pozycję Zamknij istniejące połączenia.

  4. Wybierz przycisk OK.

  5. W usłudze PMC zaktualizuj bazę danych:

    Update-Database
    

Uruchom aplikację i sprawdź, czy możesz tworzyć, edytować i wyświetlać filmy z polem Rating . Jeśli baza danych nie jest rozstawiona, ustaw punkt przerwania w metodzie SeedData.Initialize .

Następne kroki

W tej sekcji program Entity Framework Migracje Code First jest używany do:

  • Dodaj nowe pole do modelu.
  • Przeprowadź migrację zmiany schematu nowego pola do bazy danych.

Jeśli używasz programu EF Code First do automatycznego tworzenia i śledzenia bazy danych, Code First:

  • Dodaje tabelę __EFMigrationsHistory do bazy danych w celu śledzenia, czy schemat bazy danych jest zsynchronizowany z klasami modelu, z których został wygenerowany.
  • Zgłasza wyjątek, jeśli klasy modelu nie są zsynchronizowane z bazą danych.

Automatyczna weryfikacja, czy schemat i model są zsynchronizowane, ułatwia znajdowanie niespójnych problemów z kodem bazy danych.

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

  1. Models/Movie.cs Otwórz plik i dodaj Rating właściwość:

    public class Movie
    {
        public int Id { get; set; }
        public string Title { get; set; } = string.Empty;
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; } = string.Empty;
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; } = string.Empty;
    }
    
  2. Edytuj Pages/Movies/Index.cshtml, i dodaj Rating pole:

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            Title: <input type="text" asp-for="SearchString" />
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <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>
                        <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.Id">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  3. Zaktualizuj następujące strony przy użyciu Rating pola:

Aplikacja nie będzie działać, dopóki baza danych nie zostanie zaktualizowana w celu uwzględnienia nowego pola. Uruchomienie aplikacji bez aktualizacji bazy danych zgłasza błąd SqlException:

SqlException: Invalid column name 'Rating'.

Wyjątek jest spowodowany tym, że zaktualizowana SqlException klasa modelu Movie różni się od schematu tabeli Movie bazy danych. W tabeli bazy danych nie Rating ma żadnej kolumny.

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

  1. Program Entity Framework automatycznie upuszcza i ponownie utwórz bazę danych przy użyciu nowego schematu klasy modelu. Takie podejście jest wygodne na wczesnym etapie cyklu tworzenia, dzięki czemu deweloperzy mogą szybko rozwijać schemat modelu i bazy danych. Wadą jest to, że istniejące dane w bazie danych zostaną utracone. Nie używaj tego podejścia w produkcyjnej bazie danych! Usunięcie bazy danych ze zmianami schematu i użycie inicjatora do automatycznego rozmieszczania bazy danych z danymi testowymi jest często produktywnym sposobem tworzenia aplikacji.
  2. Jawnie zmodyfikuj schemat istniejącej bazy danych, tak aby odpowiadał klasom modelu. Zaletą tego podejścia jest przechowywanie danych. Wprowadź tę zmianę 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żyj Migracje Code First.

Zaktualizuj klasę SeedData , aby zapewnić jej wartość dla nowej kolumny. Poniżej przedstawiono przykładową zmianę, ale wprowadź tę zmianę dla każdego new Movie bloku.

context.Movie.AddRange(
    new Movie
    {
        Title = "When Harry Met Sally",
        ReleaseDate = DateTime.Parse("1989-2-12"),
        Genre = "Romantic Comedy",
        Price = 7.99M,
        Rating = "R"
    },

Zobacz ukończony plik SeedData.cs.

Tworzenie aplikacji

Naciśnij klawisze Ctrl+Shift B+

Dodawanie migracji dla pola klasyfikacji

  1. W menu Narzędzia wybierz pozycję NuGet Menedżer pakietów > konsoli Menedżer pakietów.

  2. W usłudze PMC wprowadź następujące polecenia:

    Add-Migration Rating
    Update-Database
    

Polecenie Add-Migration informuje platformę o następującej liczbie:

  • Movie Porównaj model ze schematem Movie bazy danych.
  • Utwórz kod, aby przeprowadzić migrację schematu bazy danych do nowego modelu.

Nazwa "Ocena" jest dowolna i służy do nazywania pliku migracji. Warto użyć znaczącej nazwy pliku migracji.

Polecenie Update-Database informuje platformę o zastosowaniu zmian schematu w bazie danych i zachowaniu istniejących danych.

Usuń wszystkie rekordy w bazie danych, inicjator zaimekuje bazę danych i dołączy Rating pole. Usuwanie można wykonać za pomocą linków usuwania w przeglądarce lub z programu Sql Server Eksplorator obiektów (SSOX).

Inną opcją jest usunięcie bazy danych i ponowne utworzenie bazy danych przy użyciu migracji. Aby usunąć bazę danych w programie SSOX:

  1. Wybierz bazę danych w programie SSOX.

  2. Kliknij prawym przyciskiem myszy bazę danych i wybierz polecenie Usuń.

  3. Zaznacz pozycję Zamknij istniejące połączenia.

  4. Wybierz przycisk OK.

  5. W usłudze PMC zaktualizuj bazę danych:

    Update-Database
    

Uruchom aplikację i sprawdź, czy możesz tworzyć, edytować i wyświetlać filmy z polem Rating . Jeśli baza danych nie jest rozstawiona, ustaw punkt przerwania w metodzie SeedData.Initialize .

Następne kroki

W tej sekcji program Entity Framework Migracje Code First jest używany do:

  • Dodaj nowe pole do modelu.
  • Przeprowadź migrację zmiany schematu nowego pola do bazy danych.

Jeśli używasz programu EF Code First do automatycznego tworzenia i śledzenia bazy danych, Code First:

  • Dodaje tabelę __EFMigrationsHistory do bazy danych w celu śledzenia, czy schemat bazy danych jest zsynchronizowany z klasami modelu, z których został wygenerowany.
  • Zgłasza wyjątek, jeśli klasy modelu nie są zsynchronizowane z bazą danych.

Automatyczna weryfikacja, czy schemat i model są zsynchronizowane, ułatwia znajdowanie niespójnych problemów z kodem bazy danych.

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

  1. Models/Movie.cs Otwórz plik i dodaj Rating właściwość:

    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; } = string.Empty;
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; } = string.Empty;
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; } = string.Empty;
    }
    
  2. Edytuj Pages/Movies/Index.cshtml, i dodaj Rating pole:

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            Title: <input type="text" asp-for="SearchString" />
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <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>
                        <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  3. Zaktualizuj następujące strony przy użyciu Rating pola:

Aplikacja nie będzie działać, dopóki baza danych nie zostanie zaktualizowana w celu uwzględnienia nowego pola. Uruchomienie aplikacji bez aktualizacji bazy danych zgłasza błąd SqlException:

SqlException: Invalid column name 'Rating'.

Wyjątek jest spowodowany tym, że zaktualizowana SqlException klasa modelu Movie różni się od schematu tabeli Movie bazy danych. W tabeli bazy danych nie Rating ma żadnej kolumny.

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

  1. Program Entity Framework automatycznie upuszcza i ponownie utwórz bazę danych przy użyciu nowego schematu klasy modelu. Takie podejście jest wygodne na wczesnym etapie cyklu tworzenia, dzięki czemu deweloperzy mogą szybko rozwijać schemat modelu i bazy danych. Wadą jest to, że istniejące dane w bazie danych zostaną utracone. Nie używaj tego podejścia w produkcyjnej bazie danych! Usunięcie bazy danych ze zmianami schematu i użycie inicjatora do automatycznego rozmieszczania bazy danych z danymi testowymi jest często produktywnym sposobem tworzenia aplikacji.
  2. Jawnie zmodyfikuj schemat istniejącej bazy danych, tak aby odpowiadał klasom modelu. Zaletą tego podejścia jest przechowywanie danych. Wprowadź tę zmianę 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żyj Migracje Code First.

Zaktualizuj klasę SeedData , aby zapewnić jej wartość dla nowej kolumny. Poniżej przedstawiono przykładową zmianę, ale wprowadź tę zmianę dla każdego new Movie bloku.

context.Movie.AddRange(
    new Movie
    {
        Title = "When Harry Met Sally",
        ReleaseDate = DateTime.Parse("1989-2-12"),
        Genre = "Romantic Comedy",
        Price = 7.99M,
        Rating = "R"
    },

Zobacz ukończony plik SeedData.cs.

Stwórz rozwiązanie.

Dodawanie migracji dla pola klasyfikacji

  1. W menu Narzędzia wybierz pozycję NuGet Menedżer pakietów > konsoli Menedżer pakietów.

  2. W usłudze PMC wprowadź następujące polecenia:

    Add-Migration Rating
    Update-Database
    

Polecenie Add-Migration informuje platformę o następującej liczbie:

  • Movie Porównaj model ze schematem Movie bazy danych.
  • Utwórz kod, aby przeprowadzić migrację schematu bazy danych do nowego modelu.

Nazwa "Ocena" jest dowolna i służy do nazywania pliku migracji. Warto użyć znaczącej nazwy pliku migracji.

Polecenie Update-Database informuje platformę o zastosowaniu zmian schematu w bazie danych i zachowaniu istniejących danych.

Usuń wszystkie rekordy w bazie danych, inicjator zaimekuje bazę danych i dołączy Rating pole. Usuwanie można wykonać za pomocą linków usuwania w przeglądarce lub z programu Sql Server Eksplorator obiektów (SSOX).

Inną opcją jest usunięcie bazy danych i ponowne utworzenie bazy danych przy użyciu migracji. Aby usunąć bazę danych w programie SSOX:

  1. Wybierz bazę danych w programie SSOX.

  2. Kliknij prawym przyciskiem myszy bazę danych i wybierz polecenie Usuń.

  3. Zaznacz pozycję Zamknij istniejące połączenia.

  4. Wybierz przycisk OK.

  5. W usłudze PMC zaktualizuj bazę danych:

    Update-Database
    

Uruchom aplikację i sprawdź, czy możesz tworzyć, edytować i wyświetlać filmy z polem Rating . Jeśli baza danych nie jest rozstawiona, ustaw punkt przerwania w metodzie SeedData.Initialize .

Następne kroki

Wyświetl lub pobierz przykładowy kod (jak pobrać).

W tej sekcji program Entity Framework Migracje Code First jest używany do:

  • Dodaj nowe pole do modelu.
  • Przeprowadź migrację zmiany schematu nowego pola do bazy danych.

W przypadku automatycznego tworzenia bazy danych przy użyciu programu EF Code First:

  • Dodaje tabelę __EFMigrationsHistory do bazy danych w celu śledzenia, czy schemat bazy danych jest zsynchronizowany z klasami modelu, z których został wygenerowany.
  • Jeśli klasy modeli nie są zsynchronizowane z bazą danych, program EF zgłasza wyjątek.

Automatyczna weryfikacja, czy schemat i model są zsynchronizowane, ułatwia znajdowanie niespójnych problemów z kodem bazy danych.

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

  1. Models/Movie.cs Otwórz plik i dodaj Rating właściwość:

    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; }
    }
    
  2. Kompilowanie aplikacji.

  3. Edytuj Pages/Movies/Index.cshtml, i dodaj Rating pole:

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            Title: <input type="text" asp-for="SearchString" />
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <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>
                        <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  4. Zaktualizuj następujące strony przy użyciu Rating pola:

Aplikacja nie będzie działać, dopóki baza danych nie zostanie zaktualizowana w celu uwzględnienia nowego pola. Uruchomienie aplikacji bez aktualizacji bazy danych zgłasza błąd SqlException:

SqlException: Invalid column name 'Rating'.

Wyjątek jest spowodowany tym, że zaktualizowana SqlException klasa modelu Movie różni się od schematu tabeli Movie bazy danych. W tabeli bazy danych nie Rating ma żadnej kolumny.

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

  1. Program Entity Framework automatycznie upuszcza i ponownie utwórz bazę danych przy użyciu nowego schematu klasy modelu. To podejście jest wygodne na wczesnym etapie cyklu programowania, dzięki czemu można szybko rozwijać model i schemat bazy danych razem. Wadą jest utrata istniejących danych w bazie danych. Nie używaj tego podejścia w produkcyjnej bazie danych! Usunięcie bazy danych ze zmianami schematu i użycie inicjatora do automatycznego rozmieszczania bazy danych z danymi testowymi jest często produktywnym sposobem tworzenia aplikacji.

  2. Jawnie zmodyfikuj schemat istniejącej bazy danych, tak aby odpowiadał klasom modelu. Zaletą tego podejścia jest przechowywanie danych. Wprowadź tę zmianę 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żyj Migracje Code First.

Zaktualizuj klasę SeedData , aby zapewnić jej wartość dla nowej kolumny. Poniżej przedstawiono przykładową zmianę, ale wprowadź tę zmianę dla każdego new Movie bloku.

context.Movie.AddRange(
    new Movie
    {
        Title = "When Harry Met Sally",
        ReleaseDate = DateTime.Parse("1989-2-12"),
        Genre = "Romantic Comedy",
        Price = 7.99M,
        Rating = "R"
    },

Zobacz ukończony plik SeedData.cs.

Stwórz rozwiązanie.

Dodawanie migracji dla pola klasyfikacji

  1. W menu Narzędzia wybierz pozycję NuGet Menedżer pakietów > konsoli Menedżer pakietów.

  2. W usłudze PMC wprowadź następujące polecenia:

    Add-Migration Rating
    Update-Database
    

Polecenie Add-Migration informuje platformę o następującej liczbie:

  • Movie Porównaj model ze schematem Movie bazy danych.
  • Utwórz kod, aby przeprowadzić migrację schematu bazy danych do nowego modelu.

Nazwa "Ocena" jest dowolna i służy do nazywania pliku migracji. Warto użyć znaczącej nazwy pliku migracji.

Polecenie Update-Database informuje platformę o zastosowaniu zmian schematu w bazie danych i zachowaniu istniejących danych.

Usuń wszystkie rekordy w bazie danych, inicjator zaimekuje bazę danych i dołączy Rating pole. Usuwanie można wykonać za pomocą linków usuwania w przeglądarce lub z programu Sql Server Eksplorator obiektów (SSOX).

Inną opcją jest usunięcie bazy danych i ponowne utworzenie bazy danych przy użyciu migracji. Aby usunąć bazę danych w programie SSOX:

  1. Wybierz bazę danych w programie SSOX.

  2. Kliknij prawym przyciskiem myszy bazę danych i wybierz polecenie Usuń.

  3. Zaznacz pozycję Zamknij istniejące połączenia.

  4. Wybierz przycisk OK.

  5. W usłudze PMC zaktualizuj bazę danych:

    Update-Database
    

Uruchom aplikację i sprawdź, czy możesz tworzyć/edytować/wyświetlać filmy z polem Rating . Jeśli baza danych nie jest rozstawiona, ustaw punkt przerwania w metodzie SeedData.Initialize .

Następne kroki

Wyświetl lub pobierz przykładowy kod (jak pobrać).

W tej sekcji program Entity Framework Migracje Code First jest używany do:

  • Dodaj nowe pole do modelu.
  • Przeprowadź migrację zmiany schematu nowego pola do bazy danych.

W przypadku automatycznego tworzenia bazy danych przy użyciu programu EF Code First:

  • Dodaje tabelę __EFMigrationsHistory do bazy danych w celu śledzenia, czy schemat bazy danych jest zsynchronizowany z klasami modelu, z których został wygenerowany.
  • Jeśli klasy modeli nie są zsynchronizowane z bazą danych, program EF zgłasza wyjątek.

Automatyczna weryfikacja, czy schemat i model są zsynchronizowane, ułatwia znajdowanie niespójnych problemów z kodem bazy danych.

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

  1. Models/Movie.cs Otwórz plik i dodaj Rating właściwość:

    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; }
    }
    
  2. Kompilowanie aplikacji.

  3. Edytuj Pages/Movies/Index.cshtml, i dodaj Rating pole:

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            Title: <input type="text" asp-for="SearchString" />
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <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>
                        <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  4. Zaktualizuj następujące strony przy użyciu Rating pola:

Aplikacja nie będzie działać, dopóki baza danych nie zostanie zaktualizowana w celu uwzględnienia nowego pola. Uruchomienie aplikacji bez aktualizacji bazy danych zgłasza błąd SqlException:

SqlException: Invalid column name 'Rating'.

Wyjątek jest spowodowany tym, że zaktualizowana SqlException klasa modelu Movie różni się od schematu tabeli Movie bazy danych. W tabeli bazy danych nie Rating ma żadnej kolumny.

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

  1. Program Entity Framework automatycznie upuszcza i ponownie utwórz bazę danych przy użyciu nowego schematu klasy modelu. To podejście jest wygodne na wczesnym etapie cyklu programowania, dzięki czemu można szybko rozwijać model i schemat bazy danych razem. Wadą jest utrata istniejących danych w bazie danych. Nie używaj tego podejścia w produkcyjnej bazie danych! Usunięcie bazy danych ze zmianami schematu i użycie inicjatora do automatycznego rozmieszczania bazy danych z danymi testowymi jest często produktywnym sposobem tworzenia aplikacji.

  2. Jawnie zmodyfikuj schemat istniejącej bazy danych, tak aby odpowiadał klasom modelu. Zaletą tego podejścia jest przechowywanie danych. Wprowadź tę zmianę 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żyj Migracje Code First.

Zaktualizuj klasę SeedData , aby zapewnić jej wartość dla nowej kolumny. Poniżej przedstawiono przykładową zmianę, ale wprowadź tę zmianę dla każdego new Movie bloku.

context.Movie.AddRange(
    new Movie
    {
        Title = "When Harry Met Sally",
        ReleaseDate = DateTime.Parse("1989-2-12"),
        Genre = "Romantic Comedy",
        Price = 7.99M,
        Rating = "R"
    },

Zobacz ukończony plik SeedData.cs.

Stwórz rozwiązanie.

Dodawanie migracji dla pola klasyfikacji

  1. W menu Narzędzia wybierz pozycję NuGet Menedżer pakietów > konsoli Menedżer pakietów.

  2. W usłudze PMC wprowadź następujące polecenia:

    Add-Migration Rating
    Update-Database
    

Polecenie Add-Migration informuje platformę o następującej liczbie:

  • Movie Porównaj model ze schematem Movie bazy danych.
  • Utwórz kod, aby przeprowadzić migrację schematu bazy danych do nowego modelu.

Nazwa "Ocena" jest dowolna i służy do nazywania pliku migracji. Warto użyć znaczącej nazwy pliku migracji.

Polecenie Update-Database informuje platformę o zastosowaniu zmian schematu w bazie danych i zachowaniu istniejących danych.

Jeśli usuniesz wszystkie rekordy w bazie danych, inicjator umieści bazę danych i dołączy Rating pole. Można to zrobić za pomocą linków usuwania w przeglądarce lub z programu Sql Server Eksplorator obiektów (SSOX).

Inną opcją jest usunięcie bazy danych i ponowne utworzenie bazy danych przy użyciu migracji. Aby usunąć bazę danych w programie SSOX:

  • Wybierz bazę danych w programie SSOX.

  • Kliknij prawym przyciskiem myszy bazę danych i wybierz polecenie Usuń.

  • Zaznacz pozycję Zamknij istniejące połączenia.

  • Wybierz przycisk OK.

  • W usłudze PMC zaktualizuj bazę danych:

    Update-Database
    

Uruchom aplikację i sprawdź, czy możesz tworzyć/edytować/wyświetlać filmy z polem Rating . Jeśli baza danych nie jest rozstawiona, ustaw punkt przerwania w metodzie SeedData.Initialize .

Następne kroki