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ą, zobacz wersję tego artykułu platformy .NET 9.
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ą, zobacz wersję tego artykułu platformy .NET 9.
Autor: Rick Anderson
W tej sekcji migracje programu Entity Framework są używane do:
- Dodaj nowe pole do modelu.
- Przeprowadź migrację nowego pola do bazy danych.
Gdy program Entity Framework (EF) jest używany do automatycznego tworzenia bazy danych na podstawie klas modeli:
- Tabela jest dodawana do bazy danych w celu śledzenia schematu bazy danych.
- Baza danych jest weryfikowana pod względem synchronizacji 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 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.cs
pliku 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.
Rating
Dodaj właściwość do pozostałych Create.cshtml
szablonów , , Details.cshtml
Delete.cshtml
i Edit.cshtml
wyświetlania.
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 Movie
elementu .
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:
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.
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.
Użyj migracji programu Entity Framework, aby zaktualizować schemat bazy danych.
Na potrzeby tego samouczka używane są migracje platformy Entity Framework.
W menu Narzędzia wybierz pozycję NuGet Menedżer pakietów > konsoli Menedżer pakietów.
W konsoli Menedżer pakietów wprowadź następujące polecenie:
Add-Migration Rating
Polecenie Add-Migration
informuje platformę migracji, aby zbadać bieżący model przy użyciu bieżącego Movie
Movie
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.
W konsoli Menedżer pakietów wprowadź następujące polecenie:
Update-Database
Polecenie Update-Database uruchamia metodę Up w migracjach, które nie zostały zastosowane.
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 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.cs
pliku 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.
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 Movie
elementu .
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:
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.
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.
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.
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 Movie
Movie
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 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.cs
pliku 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.
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 Movie
elementu .
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:
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.
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.
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.
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 Movie
Movie
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
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.cs
pliku 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.
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 Movie
elementu .
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:
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.
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.
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.
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 Movie
Movie
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
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.cs
pliku 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.
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 Movie
elementu .
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:
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.
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.
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.
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 Movie
Movie
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
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.cs
pliku 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.
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 Movie
elementu .
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:
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.
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.
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.
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 Movie
Movie
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
.