Część 8. Dodawanie nowego pola do aplikacji MVC platformy 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ę nowego pola do bazy danych.

Gdy program EF Code First jest używany do automatycznego tworzenia bazy danych, Code First:

  • Dodaje tabelę do bazy danych w celu śledzenia schematu bazy danych.
  • Sprawdza, czy baza danych jest zsynchronizowana z klasami modeli, z których została wygenerowana. Jeśli nie są one zsynchronizowane, program EF zgłasza wyjątek. Ułatwia to znajdowanie niespójnych problemów z bazą danych/kodem.

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

Rating Dodaj właściwość do elementu Models/Movie.cs:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models;

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

Tworzenie aplikacji

Naciśnij klawisze Ctrl+Shift B+

Ponieważ dodano nowe pole do Movie klasy, należy zaktualizować listę powiązań właściwości, aby ta nowa właściwość została uwzględniona. W MoviesController.cspliku zaktualizuj [Bind] atrybut dla metod Create i Edit akcji, aby uwzględnić Rating właściwość :

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Zaktualizuj szablony widoków, aby wyświetlać, tworzyć i edytować nową Rating właściwość w widoku przeglądarki.

/Views/Movies/Index.cshtml Edytuj plik i dodaj Rating pole:

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Price)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Rating)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.Movies!)
        {
            <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-action="Edit" asp-route-id="@item.Id">Edit</a> |
                    <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                    <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

Zaktualizuj pole /Views/Movies/Create.cshtml za pomocą Rating polecenia .

Możesz skopiować/wkleić poprzednią grupę formularzy i zezwolić funkcji IntelliSense na aktualizowanie pól. Funkcja IntelliSense współpracuje z pomocnikami tagów.

Deweloper wpisał literę R dla wartości atrybutu asp-for w drugim elemecie label widoku. Zostanie wyświetlone menu kontekstowe funkcji IntelliSense z wyświetlonymi dostępnymi polami, w tym ocena, która jest automatycznie wyróżniona na liście. Gdy deweloper kliknie pole lub naciśnie klawisz Enter na klawiaturze, zostanie ustawiona wartość Ocena.

Zaktualizuj pozostałe szablony.

Zaktualizuj klasę SeedData , aby zapewnić jej wartość dla nowej kolumny. Poniżej przedstawiono przykładową zmianę, ale należy wprowadzić tę zmianę dla każdego new Movieelementu .

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

Aplikacja nie będzie działać, dopóki baza danych nie zostanie zaktualizowana w celu uwzględnienia nowego pola. Jeśli jest on teraz uruchamiany, zostanie zgłoszony następujący SqlException błąd:

SqlException: Invalid column name 'Rating'.

Ten błąd występuje, ponieważ zaktualizowana klasa modelu Movie różni się od schematu tabeli Movie 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 na wczesnym etapie cyklu programowania 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. Jest to dobre podejście do wczesnego opracowywania i korzystania z sqlite.

  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 jest używana Migracje Code First.

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

Menu PMC

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

Add-Migration Rating
Update-Database

Polecenie Add-Migration informuje platformę migracji, aby zbadać bieżący model przy użyciu bieżącego MovieMovie schematu bazy danych i utworzyć niezbędny kod do zmigrowania 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.

Jeśli wszystkie rekordy w bazie danych zostaną usunięte, metoda inicjowania spowoduje zainicjowanie bazy danych i dołączenie Rating pola.

Uruchom aplikację i sprawdź, czy możesz tworzyć, edytować i wyświetlać filmy z polem Rating .

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

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

Gdy program EF Code First jest używany do automatycznego tworzenia bazy danych, Code First:

  • Dodaje tabelę do bazy danych w celu śledzenia schematu bazy danych.
  • Sprawdza, czy baza danych jest zsynchronizowana z klasami modeli, z których została wygenerowana. Jeśli nie są one zsynchronizowane, program EF zgłasza wyjątek. Ułatwia to znajdowanie niespójnych problemów z bazą danych/kodem.

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

Rating Dodaj właściwość do elementu Models/Movie.cs:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models;

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

Tworzenie aplikacji

Naciśnij klawisze Ctrl+Shift B+

Ponieważ dodano nowe pole do Movie klasy, należy zaktualizować listę powiązań właściwości, aby ta nowa właściwość została uwzględniona. W MoviesController.cspliku zaktualizuj [Bind] atrybut dla metod Create i Edit akcji, aby uwzględnić Rating właściwość :

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Zaktualizuj szablony widoków, aby wyświetlać, tworzyć i edytować nową Rating właściwość w widoku przeglądarki.

/Views/Movies/Index.cshtml Edytuj plik i dodaj Rating pole:

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Price)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Rating)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.Movies!)
        {
            <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-action="Edit" asp-route-id="@item.Id">Edit</a> |
                    <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                    <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

Zaktualizuj pole /Views/Movies/Create.cshtml za pomocą Rating polecenia .

Możesz skopiować/wkleić poprzednią grupę formularzy i zezwolić funkcji IntelliSense na aktualizowanie pól. Funkcja IntelliSense współpracuje z pomocnikami tagów.

Deweloper wpisał literę R dla wartości atrybutu asp-for w drugim elemecie label widoku. Zostanie wyświetlone menu kontekstowe funkcji IntelliSense z wyświetlonymi dostępnymi polami, w tym ocena, która jest automatycznie wyróżniona na liście. Gdy deweloper kliknie pole lub naciśnie klawisz Enter na klawiaturze, zostanie ustawiona wartość Ocena.

Zaktualizuj pozostałe szablony.

Zaktualizuj klasę SeedData , aby zapewnić jej wartość dla nowej kolumny. Poniżej przedstawiono przykładową zmianę, ale należy wprowadzić tę zmianę dla każdego new Movieelementu .

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

Aplikacja nie będzie działać, dopóki baza danych nie zostanie zaktualizowana w celu uwzględnienia nowego pola. Jeśli jest on teraz uruchamiany, zostanie zgłoszony następujący SqlException błąd:

SqlException: Invalid column name 'Rating'.

Ten błąd występuje, ponieważ zaktualizowana klasa modelu Movie różni się od schematu tabeli Movie 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 na wczesnym etapie cyklu programowania 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. Jest to dobre podejście do wczesnego opracowywania i korzystania z sqlite.

  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 jest używana Migracje Code First.

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

Menu PMC

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

Add-Migration Rating
Update-Database

Polecenie Add-Migration informuje platformę migracji, aby zbadać bieżący model przy użyciu bieżącego MovieMovie schematu bazy danych i utworzyć niezbędny kod do zmigrowania 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.

Jeśli wszystkie rekordy w bazie danych zostaną usunięte, metoda inicjowania spowoduje zainicjowanie bazy danych i dołączenie Rating pola.

Uruchom aplikację i sprawdź, czy możesz tworzyć, edytować i wyświetlać filmy z polem Rating .

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

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

Gdy program EF Code First jest używany do automatycznego tworzenia bazy danych, Code First:

  • Dodaje tabelę do bazy danych w celu śledzenia schematu bazy danych.
  • Sprawdza, czy baza danych jest zsynchronizowana z klasami modeli, z których została wygenerowana. Jeśli nie są one zsynchronizowane, program EF zgłasza wyjątek. Ułatwia to znajdowanie niespójnych problemów z bazą danych/kodem.

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

Rating Dodaj właściwość do elementu Models/Movie.cs:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models
{
    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; }
    }
}

Tworzenie aplikacji

Ctrl+Shift+B

Ponieważ dodano nowe pole do Movie klasy, należy zaktualizować listę powiązań właściwości, aby ta nowa właściwość została uwzględniona. W MoviesController.cspliku zaktualizuj [Bind] atrybut dla metod Create i Edit akcji, aby uwzględnić Rating właściwość :

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Zaktualizuj szablony widoków, aby wyświetlać, tworzyć i edytować nową Rating właściwość w widoku przeglądarki.

/Views/Movies/Index.cshtml Edytuj plik i dodaj Rating pole:

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Movies[0].Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies[0].ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies[0].Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies[0].Price)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies[0].Rating)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.Movies)
        {
            <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-action="Edit" asp-route-id="@item.Id">Edit</a> |
                    <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                    <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

Zaktualizuj pole /Views/Movies/Create.cshtml za pomocą Rating polecenia .

Możesz skopiować/wkleić poprzednią grupę formularzy i zezwolić funkcji IntelliSense na aktualizowanie pól. Funkcja IntelliSense współpracuje z pomocnikami tagów.

Deweloper wpisał literę R dla wartości atrybutu asp-for w drugim elemecie label widoku. Zostanie wyświetlone menu kontekstowe funkcji IntelliSense z wyświetlonymi dostępnymi polami, w tym ocena, która jest automatycznie wyróżniona na liście. Gdy deweloper kliknie pole lub naciśnie klawisz Enter na klawiaturze, zostanie ustawiona wartość Ocena.

Zaktualizuj pozostałe szablony.

Zaktualizuj klasę SeedData , aby zapewnić jej wartość dla nowej kolumny. Poniżej przedstawiono przykładową zmianę, ale należy wprowadzić tę zmianę dla każdego new Movieelementu .

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

Aplikacja nie będzie działać, dopóki baza danych nie zostanie zaktualizowana w celu uwzględnienia nowego pola. Jeśli jest on teraz uruchamiany, zostanie zgłoszony następujący SqlException błąd:

SqlException: Invalid column name 'Rating'.

Ten błąd występuje, ponieważ zaktualizowana klasa modelu Movie różni się od schematu tabeli Movie 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 na wczesnym etapie cyklu programowania 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. Jest to dobre podejście do wczesnego opracowywania i korzystania z sqlite.

  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 jest używana Migracje Code First.

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

Menu PMC

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

Add-Migration Rating
Update-Database

Polecenie Add-Migration informuje platformę migracji, aby zbadać bieżący model przy użyciu bieżącego MovieMovie schematu bazy danych i utworzyć niezbędny kod do zmigrowania 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.

Jeśli wszystkie rekordy w bazie danych zostaną usunięte, metoda inicjowania spowoduje zainicjowanie bazy danych i dołączenie Rating pola.

Uruchom aplikację i sprawdź, czy możesz tworzyć, edytować i wyświetlać filmy z polem Rating .

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

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

Gdy program EF Code First jest używany do automatycznego tworzenia bazy danych, Code First:

  • Dodaje tabelę do bazy danych w celu śledzenia schematu bazy danych.
  • Sprawdza, czy baza danych jest zsynchronizowana z klasami modeli, z których została wygenerowana. Jeśli nie są one zsynchronizowane, program EF zgłasza wyjątek. Ułatwia to znajdowanie niespójnych problemów z bazą danych/kodem.

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

Rating Dodaj właściwość do elementu Models/Movie.cs:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models
{
    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; }
    }
}

Tworzenie aplikacji

Ctrl+Shift+B

Ponieważ dodano nowe pole do Movie klasy, należy zaktualizować listę powiązań właściwości, aby ta nowa właściwość została uwzględniona. W MoviesController.cspliku zaktualizuj [Bind] atrybut dla metod Create i Edit akcji, aby uwzględnić Rating właściwość :

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Zaktualizuj szablony widoków, aby wyświetlać, tworzyć i edytować nową Rating właściwość w widoku przeglądarki.

/Views/Movies/Index.cshtml Edytuj plik i dodaj Rating pole:

<thead>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].ReleaseDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Genre)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Price)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Rating)
        </th>
        <th></th>
    </tr>
</thead>
<tbody>
    @foreach (var item in Model.Movies)
    {
        <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>

Zaktualizuj pole /Views/Movies/Create.cshtml za pomocą Rating polecenia .

Możesz skopiować/wkleić poprzednią grupę formularzy i zezwolić funkcji IntelliSense na aktualizowanie pól. Funkcja IntelliSense współpracuje z pomocnikami tagów.

Deweloper wpisał literę R dla wartości atrybutu asp-for w drugim elemecie label widoku. Zostanie wyświetlone menu kontekstowe funkcji IntelliSense z wyświetlonymi dostępnymi polami, w tym ocena, która jest automatycznie wyróżniona na liście. Gdy deweloper kliknie pole lub naciśnie klawisz Enter na klawiaturze, zostanie ustawiona wartość Ocena.

Zaktualizuj pozostałe szablony.

Zaktualizuj klasę SeedData , aby zapewnić jej wartość dla nowej kolumny. Poniżej przedstawiono przykładową zmianę, ale należy wprowadzić tę zmianę dla każdego new Movieelementu .

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

Aplikacja nie będzie działać, dopóki baza danych nie zostanie zaktualizowana w celu uwzględnienia nowego pola. Jeśli jest on teraz uruchamiany, zostanie zgłoszony następujący SqlException błąd:

SqlException: Invalid column name 'Rating'.

Ten błąd występuje, ponieważ zaktualizowana klasa modelu Movie różni się od schematu tabeli Movie 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 na wczesnym etapie cyklu programowania 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. Jest to dobre podejście do wczesnego opracowywania i korzystania z sqlite.

  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 jest używana Migracje Code First.

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

Menu PMC

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

Add-Migration Rating
Update-Database

Polecenie Add-Migration informuje platformę migracji, aby zbadać bieżący model przy użyciu bieżącego MovieMovie schematu bazy danych i utworzyć niezbędny kod do zmigrowania 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.

Jeśli wszystkie rekordy w bazie danych zostaną usunięte, metoda inicjowania spowoduje zainicjowanie bazy danych i dołączenie Rating pola.

Uruchom aplikację i sprawdź, czy możesz tworzyć, edytować i wyświetlać filmy z polem Rating .

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

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

Gdy program EF Code First jest używany do automatycznego tworzenia bazy danych, Code First:

  • Dodaje tabelę do bazy danych w celu śledzenia schematu bazy danych.
  • Sprawdza, czy baza danych jest zsynchronizowana z klasami modeli, z których została wygenerowana. Jeśli nie są one zsynchronizowane, program EF zgłasza wyjątek. Ułatwia to znajdowanie niespójnych problemów z bazą danych/kodem.

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

Rating Dodaj właściwość do elementu Models/Movie.cs:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models
{
    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; }
    }
}

Tworzenie aplikacji

Ctrl+Shift+B

Ponieważ dodano nowe pole do Movie klasy, należy zaktualizować listę powiązań właściwości, aby ta nowa właściwość została uwzględniona. W MoviesController.cspliku zaktualizuj [Bind] atrybut dla metod Create i Edit akcji, aby uwzględnić Rating właściwość :

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Zaktualizuj szablony widoków, aby wyświetlać, tworzyć i edytować nową Rating właściwość w widoku przeglądarki.

/Views/Movies/Index.cshtml Edytuj plik i dodaj Rating pole:

<thead>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].ReleaseDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Genre)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Price)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Rating)
        </th>
        <th></th>
    </tr>
</thead>
<tbody>
    @foreach (var item in Model.Movies)
    {
        <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>

Zaktualizuj pole /Views/Movies/Create.cshtml za pomocą Rating polecenia .

Możesz skopiować/wkleić poprzednią grupę formularzy i zezwolić funkcji IntelliSense na aktualizowanie pól. Funkcja IntelliSense współpracuje z pomocnikami tagów.

Deweloper wpisał literę R dla wartości atrybutu asp-for w drugim elemecie label widoku. Zostanie wyświetlone menu kontekstowe funkcji IntelliSense z wyświetlonymi dostępnymi polami, w tym ocena, która jest automatycznie wyróżniona na liście. Gdy deweloper kliknie pole lub naciśnie klawisz Enter na klawiaturze, zostanie ustawiona wartość Ocena.

Zaktualizuj pozostałe szablony.

Zaktualizuj klasę SeedData , aby zapewnić jej wartość dla nowej kolumny. Poniżej przedstawiono przykładową zmianę, ale należy wprowadzić tę zmianę dla każdego new Movieelementu .

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

Aplikacja nie będzie działać, dopóki baza danych nie zostanie zaktualizowana w celu uwzględnienia nowego pola. Jeśli jest on teraz uruchamiany, zostanie zgłoszony następujący SqlException błąd:

SqlException: Invalid column name 'Rating'.

Ten błąd występuje, ponieważ zaktualizowana klasa modelu Movie różni się od schematu tabeli Movie 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 na wczesnym etapie cyklu programowania 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. Jest to dobre podejście do wczesnego opracowywania i korzystania z sqlite.

  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 jest używana Migracje Code First.

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

Menu PMC

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

Add-Migration Rating
Update-Database

Polecenie Add-Migration informuje platformę migracji, aby zbadać bieżący model przy użyciu bieżącego MovieMovie schematu bazy danych i utworzyć niezbędny kod do zmigrowania 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.

Jeśli wszystkie rekordy w bazie danych zostaną usunięte, metoda inicjowania spowoduje zainicjowanie bazy danych i dołączenie Rating pola.

Uruchom aplikację i sprawdź, czy możesz tworzyć, edytować i wyświetlać filmy z polem Rating .