Dodawanie nowego pola do aplikacji ASP.NET Core MVCAdd a new field to an ASP.NET Core MVC app

Przez Rick AndersonBy Rick Anderson

W tej sekcji Entity Framework migracje Code First jest używana do:In this section Entity Framework Code First Migrations is used to:

  • Dodawanie nowego pola do modelu.Add a new field to the model.
  • Przeprowadź migrację nowe pole do bazy danych.Migrate the new field to the database.

Gdy EF Code First służy do automatycznego tworzenia bazy danych, Code First:When EF Code First is used to automatically create a database, Code First:

  • Dodaje tabelę w bazie danych do śledzenia schematu bazy danych.Adds a table to the database to track the schema of the database.
  • Sprawdza, czy baza danych jest zsynchronizowany z klasy modelu, który został wygenerowany z.Verifies the database is in sync with the model classes it was generated from. Jeśli nie są zsynchronizowane, EF zgłasza wyjątek.If they aren't in sync, EF throws an exception. Ułatwia to znajdowanie problemów z niespójne bazy danych/kodu.This makes it easier to find inconsistent database/code issues.

Dodawanie właściwości klasyfikacji do modelu MovieAdd a Rating Property to the Movie Model

Dodaj Rating właściwości Models/Movie.cs:Add a Rating property to Models/Movie.cs:

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

Utwórz aplikację (Ctrl + Shift + B).Build the app (Ctrl+Shift+B).

Ponieważ zostały dodane nowe pole do Movie klasy, należy zaktualizować powiązania białą listę dzięki tej nowej właściwości zostaną dołączone.Because you've added a new field to the Movie class, you need to update the binding white list so this new property will be included. W MoviesController.cs, zaktualizuj [Bind] atrybutu dla obu Create i Edit metody akcji, aby uwzględnić Rating właściwości:In MoviesController.cs, update the [Bind] attribute for both the Create and Edit action methods to include the Rating property:

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

Aktualizowanie szablonów widoku, aby można było wyświetlić, tworzyć i edytować nowe Rating właściwości w widoku przeglądarki.Update the view templates in order to display, create, and edit the new Rating property in the browser view.

Edytuj /Views/Movies/Index.cshtml pliku i Dodaj Rating pola:Edit the /Views/Movies/Index.cshtml file and add a Rating field:

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

Aktualizacja /Views/Movies/Create.cshtml z Rating pola.Update the /Views/Movies/Create.cshtml with a Rating field.

Można kopiowanie/wklejanie poprzedniego formularza grupy"" i umożliwić pomoc intelliSense, zaktualizuj pola.You can copy/paste the previous "form group" and let intelliSense help you update the fields. Technologia IntelliSense działa z pomocników tagów.IntelliSense works with Tag Helpers.

Deweloper wpisał literę R wartość atrybutu asp — dla w elemencie drugiego etykiety widoku.

Aktualizacja SeedData klasy tak, aby go oferuje wartości dla nowej kolumny.Update the SeedData class so that it provides a value for the new column. Poniżej przedstawiono przykładowe zmiany, ale należy to zrobić dla każdego new Movie.A sample change is shown below, but you'll want to make this change for each new Movie.

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 została zaktualizowana do nowego pola.The app won't work until the DB is updated to include the new field. Jeśli ma ona Uruchom teraz następujące SqlException jest generowany:If it's run now, the following SqlException is thrown:

SqlException: Invalid column name 'Rating'.

Ten błąd występuje, ponieważ zaktualizowane klasy modelu Movie różni się od schematu tabeli filmu istniejącej bazy danych.This error occurs because the updated Movie model class is different than the schema of the Movie table of the existing database. (Brak nie Rating kolumny w tabeli bazy danych.)(There's no Rating column in the database table.)

Istnieje kilka sposobów rozwiązania problemu:There are a few approaches to resolving the error:

  1. Ma automatycznie Porzuć i ponownie utworzyć bazę danych na podstawie nowego schematu klasy modelu Entity Framework.Have the Entity Framework automatically drop and re-create the database based on the new model class schema. To podejście jest bardzo wygodne na wczesnym etapie cyklu tworzenia oprogramowania, gdy wykonujesz active rozwoju w bazie danych testu; Umożliwia szybkie razem rozwijania schematu za jego modelu i bazie danych.This approach is very convenient early in the development cycle when you're doing active development on a test database; it allows you to quickly evolve the model and database schema together. Wadą jednak jest utraty istniejących danych w bazie danych — dzięki czemu nie chcesz używać tej metody w produkcyjnej bazie danych!The downside, though, is that you lose existing data in the database — so you don't want to use this approach on a production database! Automatycznie zapełnić bazę danych przy użyciu danych testowych za pomocą inicjatora jest często produktywny sposób tworzenia aplikacji.Using an initializer to automatically seed a database with test data is often a productive way to develop an application. Jest to dobra metoda opracowywania wczesne i, gdy przy użyciu systemu SQLite.This is a good approach for early development and when using SQLite.

  2. Jawnie zmodyfikować schemat istniejącej bazy danych, aby odpowiadały one klasy modelu.Explicitly modify the schema of the existing database so that it matches the model classes. Zaletą tego podejścia jest, aby zachować dane.The advantage of this approach is that you keep your data. Można to zrobić to ręcznie lub przez tworzenie bazy danych zmiana skryptu.You can make this change either manually or by creating a database change script.

  3. Aby zaktualizować schemat bazy danych, należy użyć migracje Code First.Use Code First Migrations to update the database schema.

W tym samouczku jest używana migracje Code First.For this tutorial, Code First Migrations is used.

Z narzędzia menu, wybierz opcję Menedżera pakietów NuGet > Konsola Menedżera pakietów.From the Tools menu, select NuGet Package Manager > Package Manager Console.

Menu konsoli zarządzania Pakietami

W konsoli zarządzania Pakietami wprowadź następujące polecenia:In the PMC, enter the following commands:

Add-Migration Rating
Update-Database

Add-Migration Polecenie informuje platformę migracji, aby sprawdzić bieżące Movie modelu z bieżącymi Movie schematu bazy danych i utworzyć niezbędny kod, aby przeprowadzić migrację bazy danych do nowego modelu.The Add-Migration command tells the migration framework to examine the current Movie model with the current Movie DB schema and create the necessary code to migrate the DB to the new model.

Nazwa "Ocena" dowolnej i jest używany do nazywania plików migracji.The name "Rating" is arbitrary and is used to name the migration file. Warto użyć znaczącą nazwę pliku migracji.It's helpful to use a meaningful name for the migration file.

Jeśli zostaną usunięte wszystkie rekordy w bazie danych, metoda inicjowania będzie obsługiwał bazy danych i zawiera Rating pola.If all the records in the DB are deleted, the initialize method will seed the DB and include the Rating field.

Uruchom aplikację i sprawdź, można tworzenia/edycji/wyświetlania filmów z Rating pola.Run the app and verify you can create/edit/display movies with a Rating field. Należy dodać Rating pole Edit, Details, i Delete wyświetlać szablony.You should add the Rating field to the Edit, Details, and Delete view templates.