Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z aktualną wersją, zobacz artykuł w wersji .NET 10.
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 +
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.
Rating Dodaj właściwość do pozostałych Create.cshtmlszablonów , , Delete.cshtmlDetails.cshtmli 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 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:
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 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.
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 +
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.
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:
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 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
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.
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:
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 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
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.
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:
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 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
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.
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:
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 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
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.
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:
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 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 .