Deel 7: een nieuw veld toevoegen aan een Razor-pagina in ASP.NET Core
Notitie
Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikelvoor de huidige release.
Waarschuwing
Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie de .NET- en .NET Core-ondersteuningsbeleidvoor meer informatie. Zie de .NET 9-versie van dit artikelvoor de huidige release.
Belangrijk
Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.
Zie de .NET 9-versie van dit artikelvoor de huidige release.
Door Rick Anderson
In deze sectie Entity Framework Core (EF Core) wordt gebruikt om het databaseschema te definiëren op basis van de modelklasse van de app:
- Voeg een nieuw veld toe aan het model.
- Migreer de nieuwe veldschemawijziging naar de database.
De EF Core aanpak maakt een flexibeler ontwikkelproces mogelijk. De ontwikkelaar werkt rechtstreeks aan het gegevensmodel van de app terwijl het databaseschema wordt gemaakt en vervolgens wordt gesynchroniseerd, allemaal zonder dat de ontwikkelaar contexten hoeft over te schakelen naar en van een databasebeheerprogramma. Zie Entity Framework Corevoor een overzicht van Entity Framework Core en de voordelen ervan.
Ef Code gebruiken om automatisch een database te maken en bij te houden:
- Voegt een
__EFMigrationsHistory
tabel toe aan de database om bij te houden of het schema van de database gesynchroniseerd is met de modelklassen waaruit deze is gegenereerd. - Genereert een uitzondering als de modelklassen niet zijn gesynchroniseerd met de database.
Automatische verificatie van het schema en model is gesynchroniseerd, waardoor het gemakkelijker is om inconsistente databasecodeproblemen te vinden.
Een classificatie-eigenschap toevoegen aan het filmmodel
Open het
Models/Movie.cs
-bestand en voeg een eigenschapRating
toe:public class Movie { public int Id { get; set; } public string Title { get; set; } = string.Empty; [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } = string.Empty; }
Pages/Movies/Index.cshtml
bewerken en eenRating
veld toevoegen:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> <label>Title: <input type="text" asp-for="SearchString" /></label> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Rating) </td> <td> <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> | <a asp-page="./Details" asp-route-id="@item.Id">Details</a> | <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a> </td> </tr> } </tbody> </table>
Werk de volgende pagina's bij met een
Rating
veld:
De app werkt pas als de database is bijgewerkt om het nieuwe veld op te nemen. Als u de app uitvoert zonder een update van de database, wordt er een SqlException
gegooid.
SqlException: Invalid column name 'Rating'.
De SqlException
uitzondering wordt veroorzaakt doordat de bijgewerkte klasse Filmmodel anders is dan het schema van de filmtabel van de database. Er is geen Rating
kolom in de databasetabel.
Er zijn enkele benaderingen om de fout op te lossen:
- Laat Entity Framework de database automatisch verwijderen en opnieuw maken met behulp van het nieuwe modelklasseschema. Deze benadering is vroeg in de ontwikkelingscyclus handig, waardoor ontwikkelaars het model en databaseschema snel samen kunnen ontwikkelen. Het nadeel is dat bestaande gegevens in de database verloren gaan. Gebruik deze methode niet voor een productiedatabase. Het verwijderen van de database bij schemawijzigingen en het gebruik van een initialisatiefunctie om de database automatisch te seeden met testgegevens is vaak een productieve manier om een app te ontwikkelen.
- Wijzig het schema van de bestaande database expliciet zodat deze overeenkomt met de modelklassen. Het voordeel van deze aanpak is het bewaren van de gegevens. Breng deze wijziging handmatig aan of door een databasewijzigingsscript te maken.
- Gebruik EF Core Migrations om het databaseschema bij te werken.
Gebruik voor deze zelfstudie EF Core Migraties.
Werk de SeedData
-klasse bij zodat deze een waarde voor de nieuwe kolom biedt. Hieronder ziet u een voorbeeldwijziging, maar breng deze wijziging aan voor elk new Movie
blok.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Zie de voltooide SeedData.cs bestand.
De app bouwen
Druk op Ctrl+Shift+B
Een migratie voor het beoordelingsveld toevoegen
Selecteer in het menu ToolsNuGet Package Manager > Package Manager Console.
Voer in de Package Manager Console (PMC) de volgende opdracht in:
Add-Migration Rating
De opdracht Add-Migration
geeft aan dat het framework het volgende moet doen:
- Vergelijk het
Movie
model met hetMovie
databaseschema. - Maak code om het databaseschema naar het nieuwe model te migreren.
De naam Rating is willekeurig en wordt gebruikt om het migratiebestand een naam te geven. Het is handig om een zinvolle naam te gebruiken voor het migratiebestand.
Voer in de PMC de volgende opdracht in:
Update-Database
De opdracht Update-Database
vertelt het framework om de schemawijzigingen toe te passen op de database en om bestaande gegevens te behouden.
Verwijder alle records in de database, de initialisatiefunctie zal de database seeden en het Rating
veld bevatten. Verwijderen kan worden gedaan met de verwijderkoppelingen in de browser of vanuit Sql Server Object Explorer (SSOX).
Een andere optie is om de database te verwijderen en migraties te gebruiken om de database opnieuw te maken. De database verwijderen in SSOX:
Selecteer de database in SSOX.
Klik met de rechtermuisknop op de database en selecteer verwijderen.
Controleer Bestaande verbindingen sluiten.
Selecteer OK -.
Werk de database bij in de PMC.
Update-Database
Voer de app uit en controleer of u films kunt maken, bewerken en weergeven met een Rating
veld. Als de database niet wordt gezaaid, stelt u een onderbrekingspunt in de methode SeedData.Initialize
in.
Volgende stappen
In deze sectie wordt Entity Framework Code First Migrations gebruikt om:
- Voeg een nieuw veld toe aan het model.
- Migreer de nieuwe veldschemawijziging naar de database.
Wanneer u EF Code First gebruikt om automatisch een database te maken en bij te houden, code first:
- Voegt een
__EFMigrationsHistory
tabel toe aan de database om bij te houden of het schema van de database gesynchroniseerd is met de modelklassen waaruit deze is gegenereerd. - Genereert een uitzondering als de modelklassen niet zijn gesynchroniseerd met de database.
Automatische verificatie van het schema en model is gesynchroniseerd, waardoor het gemakkelijker is om inconsistente databasecodeproblemen te vinden.
Een classificatie-eigenschap toevoegen aan het filmmodel
Open het
Models/Movie.cs
-bestand en voeg een eigenschapRating
toe:public class Movie { public int Id { get; set; } public string Title { get; set; } = string.Empty; [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } = string.Empty; }
Pages/Movies/Index.cshtml
bewerken en eenRating
veld toevoegen:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> <label>Title: <input type="text" asp-for="SearchString" /></label> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Rating) </td> <td> <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> | <a asp-page="./Details" asp-route-id="@item.Id">Details</a> | <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a> </td> </tr> } </tbody> </table>
Werk de volgende pagina's bij met een
Rating
veld:
De app werkt pas als de database is bijgewerkt om het nieuwe veld op te nemen. De app uitvoeren zonder de database te updaten gooit een SqlException
:
SqlException: Invalid column name 'Rating'.
De SqlException
uitzondering wordt veroorzaakt doordat de bijgewerkte klasse Filmmodel anders is dan het schema van de filmtabel van de database. Er is geen Rating
kolom in de databasetabel.
Er zijn enkele benaderingen om de fout op te lossen:
- Laat Entity Framework de database automatisch verwijderen en opnieuw maken met behulp van het nieuwe modelklasseschema. Deze benadering is vroeg in de ontwikkelingscyclus handig, waardoor ontwikkelaars het model en databaseschema snel samen kunnen ontwikkelen. Het nadeel is dat bestaande gegevens in de database verloren gaan. Gebruik deze methode niet voor een productiedatabase. Het verwijderen van de database bij schemawijzigingen en het gebruik van een initialisatiefunctie om de database automatisch te seeden met testgegevens is vaak een productieve manier om een app te ontwikkelen.
- Wijzig het schema van de bestaande database expliciet zodat deze overeenkomt met de modelklassen. Het voordeel van deze aanpak is het bewaren van de gegevens. Breng deze wijziging handmatig aan of door een databasewijzigingsscript te maken.
- Gebruik Code First Migrations om het databaseschema bij te werken.
Voor deze zelfstudie gebruikt u Code First Migrations.
Werk de SeedData
-klasse bij zodat deze een waarde voor de nieuwe kolom biedt. Hieronder ziet u een voorbeeldwijziging, maar breng deze wijziging aan voor elk new Movie
blok.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Zie de voltooide SeedData.cs bestand.
De app bouwen
Druk op Ctrl+Shift+B
Een migratie voor het beoordelingsveld toevoegen
Selecteer in het menu ToolsNuGet Package Manager > Package Manager Console.
Voer in de PMC de volgende opdrachten in:
Add-Migration Rating Update-Database
De opdracht Add-Migration
geeft aan dat het framework het volgende moet doen:
- Vergelijk het
Movie
model met hetMovie
databaseschema. - Maak code om het databaseschema naar het nieuwe model te migreren.
De naam Rating is willekeurig en wordt gebruikt om het migratiebestand een naam te geven. Het is handig om een zinvolle naam te gebruiken voor het migratiebestand.
De opdracht Update-Database
vertelt het framework om de schemawijzigingen toe te passen op de database en om bestaande gegevens te behouden.
Verwijder alle records in de database, de initialisatiefunctie zal de database seeden en het Rating
veld bevatten. Verwijderen kan worden gedaan met de verwijderkoppelingen in de browser of vanuit Sql Server Object Explorer (SSOX).
Een andere optie is om de database te verwijderen en migraties te gebruiken om de database opnieuw te maken. De database verwijderen in SSOX:
Selecteer de database in SSOX.
Klik met de rechtermuisknop op de database en selecteer verwijderen.
Controleer Sluit bestaande verbindingen.
Selecteer OK-.
Werk de database bij in de PMC-.
Update-Database
Voer de app uit en controleer of u films kunt maken, bewerken en weergeven met een Rating
veld. Als de database niet is gevuld, stel dan een onderbrekingspunt in de methode SeedData.Initialize
in.
Volgende stappen
In deze sectie wordt Entity Framework Code First Migrations gebruikt om:
- Voeg een nieuw veld toe aan het model.
- Migreer de nieuwe veldschemawijziging naar de database.
Wanneer u EF Code First gebruikt om automatisch een database te maken en bij te houden, code first:
- Voegt een
__EFMigrationsHistory
tabel toe aan de database om bij te houden of het schema van de database gesynchroniseerd is met de modelklassen waaruit deze is gegenereerd. - Genereert een uitzondering als de modelklassen niet zijn gesynchroniseerd met de database.
Automatische verificatie van het schema en model is gesynchroniseerd, waardoor het gemakkelijker is om inconsistente databasecodeproblemen te vinden.
Een classificatie-eigenschap toevoegen aan het filmmodel
Open het
Models/Movie.cs
-bestand en voeg een eigenschapRating
toe:public class Movie { public int Id { get; set; } public string Title { get; set; } = string.Empty; [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } = string.Empty; }
Pages/Movies/Index.cshtml
bewerken en eenRating
veld toevoegen:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> <label>Title: <input type="text" asp-for="SearchString" /></label> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Rating) </td> <td> <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> | <a asp-page="./Details" asp-route-id="@item.Id">Details</a> | <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a> </td> </tr> } </tbody> </table>
Werk de volgende pagina's bij met een
Rating
veld:
De app werkt pas als de database is bijgewerkt om het nieuwe veld op te nemen. Het uitvoeren van de app zonder een update van de database resulteert in een SqlException
:
SqlException: Invalid column name 'Rating'.
De SqlException
uitzondering wordt veroorzaakt doordat de bijgewerkte klasse Filmmodel anders is dan het schema van de filmtabel van de database. Er is geen Rating
kolom in de databasetabel.
Er zijn enkele benaderingen om de fout op te lossen:
- Laat Entity Framework de database automatisch verwijderen en opnieuw maken met behulp van het nieuwe modelklasseschema. Deze benadering is vroeg in de ontwikkelingscyclus handig, waardoor ontwikkelaars het model en databaseschema snel samen kunnen ontwikkelen. Het nadeel is dat bestaande gegevens in de database verloren gaan. Gebruik deze methode niet voor een productiedatabase. Het verwijderen van de database bij schemawijzigingen en het gebruik van een initialisatiefunctie om de database automatisch te seeden met testgegevens is vaak een productieve manier om een app te ontwikkelen.
- Wijzig het schema van de bestaande database expliciet zodat deze overeenkomt met de modelklassen. Het voordeel van deze aanpak is het bewaren van de gegevens. Breng deze wijziging handmatig aan of door een databasewijzigingsscript te maken.
- Gebruik Code First Migrations om het databaseschema bij te werken.
Voor deze zelfstudie gebruikt u Code First Migrations.
Werk de SeedData
-klasse bij zodat deze een waarde voor de nieuwe kolom biedt. Hieronder ziet u een voorbeeldwijziging, maar breng deze wijziging aan voor elk new Movie
blok.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Zie de voltooide SeedData.cs bestand.
De app bouwen
Druk op Ctrl+Shift+B
Een migratie voor het beoordelingsveld toevoegen
Selecteer in het menu ToolsNuGet Package Manager > Package Manager Console.
Voer in de PMC de volgende opdrachten in:
Add-Migration Rating Update-Database
De opdracht Add-Migration
geeft aan dat het framework het volgende moet doen:
- Vergelijk het
Movie
model met hetMovie
databaseschema. - Maak code om het databaseschema naar het nieuwe model te migreren.
De naam Rating is willekeurig en wordt gebruikt om het migratiebestand een naam te geven. Het is handig om een zinvolle naam te gebruiken voor het migratiebestand.
De opdracht Update-Database
vertelt het framework om de schemawijzigingen toe te passen op de database en om bestaande gegevens te behouden.
Verwijder alle records in de database, de initialisatiefunctie zal de database seeden en het Rating
veld bevatten. Verwijderen kan worden gedaan met de verwijderkoppelingen in de browser of vanuit Sql Server Object Explorer (SSOX).
Een andere optie is om de database te verwijderen en migraties te gebruiken om de database opnieuw te maken. De database verwijderen in SSOX:
Selecteer de database in SSOX.
Klik met de rechtermuisknop op de database en selecteer verwijderen.
Controleer Sluit bestaande verbindingen.
Selecteer OK-.
Werk de database bij in de PMC.
Update-Database
Voer de app uit en controleer of u films kunt maken, bewerken en weergeven met een Rating
veld. Als de database niet wordt gezaaid, stelt u een onderbrekingspunt in de methode SeedData.Initialize
in.
Volgende stappen
In deze sectie wordt Entity Framework Code First Migrations gebruikt om:
- Voeg een nieuw veld toe aan het model.
- Migreer de nieuwe veldschemawijziging naar de database.
Wanneer u EF Code First gebruikt om automatisch een database te maken en bij te houden, code first:
- Voegt een
__EFMigrationsHistory
tabel toe aan de database om bij te houden of het schema van de database gesynchroniseerd is met de modelklassen waaruit deze is gegenereerd. - Genereert een uitzondering als de modelklassen niet zijn gesynchroniseerd met de database.
Automatische verificatie van het schema en model is gesynchroniseerd, waardoor het gemakkelijker is om inconsistente databasecodeproblemen te vinden.
Een classificatie-eigenschap toevoegen aan het filmmodel
Open het
Models/Movie.cs
-bestand en voeg een eigenschapRating
toe:public class Movie { public int ID { get; set; } public string Title { get; set; } = string.Empty; [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } = string.Empty; }
Pages/Movies/Index.cshtml
bewerken en eenRating
veld toevoegen:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> <label>Title: <input type="text" asp-for="SearchString" /></label> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Rating) </td> <td> <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> | <a asp-page="./Details" asp-route-id="@item.ID">Details</a> | <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a> </td> </tr> } </tbody> </table>
Werk de volgende pagina's bij met een
Rating
veld:
De app werkt pas als de database is bijgewerkt om het nieuwe veld op te nemen. Als u de app uitvoert zonder een update van de database, wordt er een SqlException
:
SqlException: Invalid column name 'Rating'.
De SqlException
uitzondering wordt veroorzaakt doordat de bijgewerkte klasse Filmmodel anders is dan het schema van de filmtabel van de database. Er is geen Rating
kolom in de databasetabel.
Er zijn enkele benaderingen om de fout op te lossen:
- Laat Entity Framework de database automatisch verwijderen en opnieuw maken met behulp van het nieuwe modelklasseschema. Deze benadering is vroeg in de ontwikkelingscyclus handig, waardoor ontwikkelaars het model en databaseschema snel samen kunnen ontwikkelen. Het nadeel is dat bestaande gegevens in de database verloren gaan. Gebruik deze methode niet voor een productiedatabase. Het verwijderen van de database bij schemawijzigingen en het gebruik van een initialisatiefunctie om de database automatisch te seeden met testgegevens is vaak een productieve manier om een app te ontwikkelen.
- Wijzig het schema van de bestaande database expliciet zodat deze overeenkomt met de modelklassen. Het voordeel van deze aanpak is het bewaren van de gegevens. Breng deze wijziging handmatig aan of door een databasewijzigingsscript te maken.
- Gebruik Code First Migrations om het databaseschema bij te werken.
Voor deze zelfstudie gebruikt u Code First Migrations.
Werk de SeedData
-klasse bij zodat deze een waarde voor de nieuwe kolom biedt. Hieronder ziet u een voorbeeldwijziging, maar breng deze wijziging aan voor elk new Movie
blok.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Zie de voltooide SeedData.cs bestand.
Bouw de oplossing.
Een migratie voor het beoordelingsveld toevoegen
Selecteer in het menu ToolsNuGet Package Manager > Package Manager Console.
Voer in de PMC de volgende opdrachten in:
Add-Migration Rating Update-Database
De opdracht Add-Migration
geeft aan dat het framework het volgende moet doen:
- Vergelijk het
Movie
model met hetMovie
databaseschema. - Maak code om het databaseschema naar het nieuwe model te migreren.
De naam Rating is willekeurig en wordt gebruikt om het migratiebestand een naam te geven. Het is handig om een zinvolle naam te gebruiken voor het migratiebestand.
De opdracht Update-Database
vertelt het framework om de schemawijzigingen toe te passen op de database en om bestaande gegevens te behouden.
Verwijder alle records in de database, de initialisatiefunctie zal de database seeden en het Rating
veld bevatten. Verwijderen kan worden gedaan met de verwijderkoppelingen in de browser of vanuit Sql Server Object Explorer (SSOX).
Een andere optie is om de database te verwijderen en migraties te gebruiken om de database opnieuw te maken. De database verwijderen in SSOX:
Selecteer de database in SSOX.
Klik met de rechtermuisknop op de database en selecteer verwijderen.
Controleer Bestaande verbindingen sluiten.
Selecteer OK-.
Werk de database bij in de PMC.
Update-Database
Voer de app uit en controleer of u films kunt maken, bewerken en weergeven met een Rating
veld. Als de database niet wordt gezaaid, stelt u een onderbrekingspunt in de methode SeedData.Initialize
in.
Volgende stappen
Voorbeeldcode bekijken of downloaden (hoe te downloaden).
In deze sectie wordt Entity Framework Code First Migrations gebruikt om:
- Voeg een nieuw veld toe aan het model.
- Migreer de nieuwe veldschemawijziging naar de database.
Wanneer u EF Code First gebruikt om automatisch een database te maken, code first:
- Voegt een
__EFMigrationsHistory
tabel toe aan de database om bij te houden of het schema van de database gesynchroniseerd is met de modelklassen waaruit deze is gegenereerd. - Als de modelklassen niet zijn gesynchroniseerd met de database, genereert EF een uitzondering.
Automatische verificatie van het schema en model is gesynchroniseerd, waardoor het gemakkelijker is om inconsistente databasecodeproblemen te vinden.
Een classificatie-eigenschap toevoegen aan het filmmodel
Open het
Models/Movie.cs
-bestand en voeg een eigenschapRating
toe: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; } }
Bouw de app.
Bewerk
Pages/Movies/Index.cshtml
en voeg eenRating
veld toe:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> <label>Title: <input type="text" asp-for="SearchString" /></label> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Rating) </td> <td> <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> | <a asp-page="./Details" asp-route-id="@item.ID">Details</a> | <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a> </td> </tr> } </tbody> </table>
Werk de volgende pagina's bij met een
Rating
veld:
De app werkt pas als de database is bijgewerkt om het nieuwe veld op te nemen. Bij het uitvoeren van de app zonder de database bij te werken, ontstaat er een SqlException
.
SqlException: Invalid column name 'Rating'.
De SqlException
uitzondering wordt veroorzaakt doordat de bijgewerkte klasse Filmmodel anders is dan het schema van de filmtabel van de database. Er is geen Rating
kolom in de databasetabel.
Er zijn enkele benaderingen om de fout op te lossen:
Laat Entity Framework de database automatisch verwijderen en opnieuw maken met behulp van het nieuwe modelklasseschema. Deze benadering is vroeg in de ontwikkelingscyclus handig, zodat u snel het model en databaseschema samen kunt ontwikkelen. Het nadeel is dat u bestaande gegevens in de database kwijtraakt. Gebruik deze methode niet voor een productiedatabase. Het verwijderen van de database bij schemawijzigingen en het gebruik van een initialisatiefunctie om de database automatisch te seeden met testgegevens is vaak een productieve manier om een app te ontwikkelen.
Wijzig het schema van de bestaande database expliciet zodat deze overeenkomt met de modelklassen. Het voordeel van deze aanpak is het bewaren van de gegevens. Breng deze wijziging handmatig aan of door een databasewijzigingsscript te maken.
Gebruik Code First Migrations om het databaseschema bij te werken.
Voor deze zelfstudie gebruikt u Code First Migrations.
Werk de SeedData
-klasse bij zodat deze een waarde voor de nieuwe kolom biedt. Hieronder ziet u een voorbeeldwijziging, maar breng deze wijziging aan voor elk new Movie
blok.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Zie de voltooide SeedData.cs bestand.
Bouw de oplossing.
Een migratie voor het beoordelingsveld toevoegen
Selecteer in het menu ToolsNuGet Package Manager > Package Manager Console.
Voer in de PMC de volgende opdrachten in:
Add-Migration Rating Update-Database
De opdracht Add-Migration
geeft aan dat het framework het volgende moet doen:
- Vergelijk het
Movie
model met hetMovie
databaseschema. - Maak code om het databaseschema naar het nieuwe model te migreren.
De naam Rating is willekeurig en wordt gebruikt om het migratiebestand een naam te geven. Het is handig om een zinvolle naam te gebruiken voor het migratiebestand.
De opdracht Update-Database
vertelt het framework om de schemawijzigingen toe te passen op de database en om bestaande gegevens te behouden.
Verwijder alle records in de database, de initialisatiefunctie zal de database seeden en het Rating
veld bevatten. Verwijderen kan worden gedaan met de verwijderkoppelingen in de browser of vanuit Sql Server Object Explorer (SSOX).
Een andere optie is om de database te verwijderen en migraties te gebruiken om de database opnieuw te maken. De database verwijderen in SSOX:
Selecteer de database in SSOX.
Klik met de rechtermuisknop op de database en selecteer verwijderen.
Controleer Bestaande verbindingen sluiten.
Selecteer OK-.
Werk de database bij in de PMC.
Update-Database
Voer de app uit en controleer of u films kunt maken/bewerken/weergeven met een Rating
veld. Als de database niet is gevuld, stelt u een onderbrekingspunt in in de methode SeedData.Initialize
.
Volgende stappen
Voorbeeldcode bekijken of downloaden (hoe te downloaden).
In deze sectie wordt Entity Framework Code First Migrations gebruikt om:
- Voeg een nieuw veld toe aan het model.
- Migreer de nieuwe veldschemawijziging naar de database.
Wanneer u EF Code First gebruikt om automatisch een database te maken, code first:
- Voegt een
__EFMigrationsHistory
tabel toe aan de database om bij te houden of het schema van de database gesynchroniseerd is met de modelklassen waaruit deze is gegenereerd. - Als de modelklassen niet zijn gesynchroniseerd met de database, genereert EF een uitzondering.
Automatische verificatie van het schema en model is gesynchroniseerd, waardoor het gemakkelijker is om inconsistente databasecodeproblemen te vinden.
Een classificatie-eigenschap toevoegen aan het filmmodel
Open het
Models/Movie.cs
-bestand en voeg een eigenschapRating
toe: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; } }
Bouw de app.
Bewerk
Pages/Movies/Index.cshtml
en voeg eenRating
veld toe:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> <label>Title: <input type="text" asp-for="SearchString" /></label> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Rating) </td> <td> <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> | <a asp-page="./Details" asp-route-id="@item.ID">Details</a> | <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a> </td> </tr> } </tbody> </table>
Werk de volgende pagina's bij met een
Rating
veld:
De app werkt pas als de database is bijgewerkt om het nieuwe veld op te nemen. Als u de app uitvoert zonder een update van de database, wordt er een SqlException
gegenereerd.
SqlException: Invalid column name 'Rating'.
De SqlException
uitzondering wordt veroorzaakt doordat de bijgewerkte klasse Filmmodel anders is dan het schema van de filmtabel van de database. Er is geen Rating
kolom in de databasetabel.
Er zijn enkele benaderingen om de fout op te lossen:
Laat Entity Framework de database automatisch verwijderen en opnieuw maken met behulp van het nieuwe modelklasseschema. Deze benadering is vroeg in de ontwikkelingscyclus handig, zodat u snel het model en databaseschema samen kunt ontwikkelen. Het nadeel is dat u bestaande gegevens in de database kwijtraakt. Gebruik deze methode niet voor een productiedatabase. Het verwijderen van de database bij schemawijzigingen en het gebruik van een initialisatiefunctie om de database automatisch te seeden met testgegevens is vaak een productieve manier om een app te ontwikkelen.
Wijzig het schema van de bestaande database expliciet zodat deze overeenkomt met de modelklassen. Het voordeel van deze aanpak is het bewaren van de gegevens. Breng deze wijziging handmatig aan of door een databasewijzigingsscript te maken.
Gebruik Code First Migrations om het databaseschema bij te werken.
Voor deze zelfstudie gebruikt u Code First Migrations.
Werk de SeedData
-klasse bij zodat deze een waarde voor de nieuwe kolom biedt. Hieronder ziet u een voorbeeldwijziging, maar breng deze wijziging aan voor elk new Movie
blok.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Zie het voltooide SeedData.cs bestand.
Bouw de oplossing.
Een migratie voor het beoordelingsveld toevoegen
Selecteer in het menu ToolsNuGet Package Manager > Package Manager Console.
Voer in de PMC de volgende opdrachten in:
Add-Migration Rating Update-Database
De opdracht Add-Migration
geeft aan dat het framework het volgende moet doen:
- Vergelijk het
Movie
model met hetMovie
databaseschema. - Maak code om het databaseschema naar het nieuwe model te migreren.
De naam Rating is willekeurig en wordt gebruikt om het migratiebestand een naam te geven. Het is handig om een zinvolle naam te gebruiken voor het migratiebestand.
De opdracht Update-Database
vertelt het framework om de schemawijzigingen toe te passen op de database en om bestaande gegevens te behouden.
Als u alle records in de database verwijdert, wordt de database door de initialisatiefunctie geseed en wordt het veld Rating
opgenomen. U kunt dit doen met de verwijderkoppelingen in de browser of vanuit Sql Server Object Explorer (SSOX).
Een andere optie is om de database te verwijderen en migraties te gebruiken om de database opnieuw te maken. De database verwijderen in SSOX:
Selecteer de database in SSOX.
Klik met de rechtermuisknop op de database en selecteer verwijderen.
Controleer Bestaande verbindingen sluiten.
Selecteer OK-.
Werk de database bij in de PMC-.
Update-Database
Voer de app uit en controleer of u films kunt maken/bewerken/weergeven met een Rating
veld. Als de database niet is gevuld, stel dan een onderbrekingspunt in de methode SeedData.Initialize
in.