Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Opmerking
Dit is niet de nieuwste versie van dit artikel. Zie de .NET 10-versie van dit artikel voor de huidige release.
Waarschuwing
Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie het .NET- en .NET Core-ondersteuningsbeleid voor meer informatie. Zie de .NET 9-versie van dit artikel voor de huidige release.
Door Rick Anderson
In deze sectie wordt Entity Framework-migraties gebruikt om:
- Voeg een nieuw veld toe aan het model.
- Migreer het nieuwe veld naar de database.
Wanneer Entity Framework (EF) wordt gebruikt om automatisch een database te maken op basis van modelklassen:
- Er wordt een tabel toegevoegd aan de database om het schema van de database bij te houden.
- De database is gesynchroniseerd met de modelklassen waaruit deze is gegenereerd. Als ze niet synchroon zijn, genereert EF een uitzondering. Dit maakt het gemakkelijker om inconsistente database-/codeproblemen te vinden.
Een classificatie-eigenschap toevoegen aan het filmmodel
Voeg een Rating eigenschap toe aan 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; }
}
De app bouwen
Druk op Ctrl+Shift+B
Omdat u een nieuw veld aan de Movie klasse hebt toegevoegd, moet u de lijst met eigenschappenbindingen bijwerken, zodat deze nieuwe eigenschap wordt opgenomen. Werk MoviesController.csin het [Bind] kenmerk voor zowel de Create als Edit de actiemethoden bij om de Rating eigenschap op te nemen:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Werk de weergavesjablonen bij om de nieuwe Rating eigenschap in de browserweergave weer te geven, te maken en te bewerken.
Bewerk het /Views/Movies/Index.cshtml bestand en voeg een Rating veld toe:
<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>
Werk het /Views/Movies/Create.cshtml bij met een Rating veld.
U kunt de vorige 'formuliergroep' kopiëren/plakken en intelliSense de velden laten bijwerken. IntelliSense werkt met Tag Helpers.
Voeg de Rating eigenschap toe aan de resterende weergavesjablonen van Create.cshtml, Delete.cshtml, Details.cshtml, en Edit.cshtml.
Werk de SeedData-klasse bij zodat deze een waarde voor de nieuwe kolom biedt. Hieronder ziet u een voorbeeldwijziging, maar u wilt deze wijziging voor elke new Moviewijziging aanbrengen.
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
De app werkt pas als de database is bijgewerkt om het nieuwe veld op te nemen. Als deze nu wordt uitgevoerd, wordt het volgende SqlException gegenereerd:
SqlException: Invalid column name 'Rating'.
Deze fout treedt op omdat de bijgewerkte klasse Movie-model verschilt van het schema van de tabel Movie van de bestaande 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 op basis van het nieuwe modelklasseschema. Deze aanpak is erg handig vroeg in de ontwikkelingscyclus wanneer u actieve ontwikkeling uitvoert op een testdatabase; hiermee kunt u snel het model en databaseschema samen ontwikkelen. Het nadeel is echter dat u bestaande gegevens in de database kwijtraakt, dus u wilt deze benadering niet gebruiken voor een productiedatabase. Het gebruik van een initialisatiefunctie om automatisch een database te seeden met testgegevens is vaak een productieve manier om een toepassing te ontwikkelen. Dit is een goede aanpak voor vroege ontwikkeling en bij het gebruik van SQLite.
Wijzig het schema van de bestaande database expliciet zodat deze overeenkomt met de modelklassen. Het voordeel van deze aanpak is dat u uw gegevens bewaart. U kunt deze wijziging handmatig aanbrengen of door een databasewijzigingsscript te maken.
Gebruik Entity Framework-migraties om het databaseschema bij te werken.
Voor deze zelfstudie worden Entity Framework-migraties gebruikt.
Selecteer in het menu ToolsNuGet Package Manager > Package Manager Console.
Voer in de Package Manager-console de volgende opdracht in:
Add-Migration Rating
De Add-Migration opdracht vertelt het migratieframework om het huidige Movie model te onderzoeken met het huidige Movie DB-schema en de benodigde code te maken om de database 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.
Als alle records in de database worden verwijderd, wordt met de initialisatiemethode de database geseed en wordt het Rating veld opgenomen.
Voer in de Package Manager-console de volgende opdracht in:
Update-Database
Met de opdracht Update-Database wordt de upmethode uitgevoerd in migraties die niet zijn toegepast.
Voer de app uit en controleer of u films kunt maken, bewerken en weergeven met een Rating veld.
In deze sectie wordt Entity Framework Code First Migrations gebruikt om:
- Voeg een nieuw veld toe aan het model.
- Migreer het nieuwe veld naar de database.
Wanneer EF Code First wordt gebruikt om automatisch een database te maken, code first:
- Voegt een tabel toe aan de database om het schema van de database bij te houden.
- Controleert of de database gesynchroniseerd is met de modelklassen waaruit deze is gegenereerd. Als ze niet synchroon zijn, genereert EF een uitzondering. Dit maakt het gemakkelijker om inconsistente database-/codeproblemen te vinden.
Een classificatie-eigenschap toevoegen aan het filmmodel
Voeg een Rating eigenschap toe aan 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; }
}
De app bouwen
Druk op Ctrl+Shift+B
Omdat u een nieuw veld aan de Movie klasse hebt toegevoegd, moet u de lijst met eigenschappenbindingen bijwerken, zodat deze nieuwe eigenschap wordt opgenomen. Werk MoviesController.csin het [Bind] kenmerk voor zowel de Create als Edit de actiemethoden bij om de Rating eigenschap op te nemen:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Werk de weergavesjablonen bij om de nieuwe Rating eigenschap in de browserweergave weer te geven, te maken en te bewerken.
Bewerk het /Views/Movies/Index.cshtml bestand en voeg een Rating veld toe:
<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>
Werk het /Views/Movies/Create.cshtml bij met een Rating veld.
U kunt de vorige 'formuliergroep' kopiëren/plakken en intelliSense de velden laten bijwerken. IntelliSense werkt met Tag Helpers.
Werk de resterende sjablonen bij.
Werk de SeedData-klasse bij zodat deze een waarde voor de nieuwe kolom biedt. Hieronder ziet u een voorbeeldwijziging, maar u wilt deze wijziging voor elke new Moviewijziging aanbrengen.
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
De app werkt pas als de database is bijgewerkt om het nieuwe veld op te nemen. Als deze nu wordt uitgevoerd, wordt het volgende SqlException gegenereerd:
SqlException: Invalid column name 'Rating'.
Deze fout treedt op omdat de bijgewerkte klasse Movie-model verschilt van het schema van de tabel Movie van de bestaande 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 op basis van het nieuwe modelklasseschema. Deze aanpak is erg handig vroeg in de ontwikkelingscyclus wanneer u actieve ontwikkeling uitvoert op een testdatabase; hiermee kunt u snel het model en databaseschema samen ontwikkelen. Het nadeel is echter dat u bestaande gegevens in de database kwijtraakt, dus u wilt deze benadering niet gebruiken voor een productiedatabase. Het gebruik van een initialisatiefunctie om automatisch een database te seeden met testgegevens is vaak een productieve manier om een toepassing te ontwikkelen. Dit is een goede aanpak voor vroege ontwikkeling en bij het gebruik van SQLite.
Wijzig het schema van de bestaande database expliciet zodat deze overeenkomt met de modelklassen. Het voordeel van deze aanpak is dat u uw gegevens bewaart. U kunt deze wijziging handmatig aanbrengen of door een databasewijzigingsscript te maken.
Gebruik Code First Migrations om het databaseschema bij te werken.
Voor deze zelfstudie wordt Code First Migrations gebruikt.
Selecteer in het menu ToolsNuGet Package Manager > Package Manager Console.
Voer in de PMC de volgende opdrachten in:
Add-Migration Rating
Update-Database
De Add-Migration opdracht vertelt het migratieframework om het huidige Movie model te onderzoeken met het huidige Movie DB-schema en de benodigde code te maken om de database 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.
Als alle records in de database worden verwijderd, wordt met de initialisatiemethode de database geseed en wordt het Rating veld opgenomen.
Voer de app uit en controleer of u films kunt maken, bewerken en weergeven met een Rating veld.
In deze sectie wordt Entity Framework Code First Migrations gebruikt om:
- Voeg een nieuw veld toe aan het model.
- Migreer het nieuwe veld naar de database.
Wanneer EF Code First wordt gebruikt om automatisch een database te maken, code first:
- Voegt een tabel toe aan de database om het schema van de database bij te houden.
- Controleert of de database gesynchroniseerd is met de modelklassen waaruit deze is gegenereerd. Als ze niet synchroon zijn, genereert EF een uitzondering. Dit maakt het gemakkelijker om inconsistente database-/codeproblemen te vinden.
Een classificatie-eigenschap toevoegen aan het filmmodel
Voeg een Rating eigenschap toe aan 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; }
}
De app bouwen
Druk op Ctrl+Shift+B
Omdat u een nieuw veld aan de Movie klasse hebt toegevoegd, moet u de lijst met eigenschappenbindingen bijwerken, zodat deze nieuwe eigenschap wordt opgenomen. Werk MoviesController.csin het [Bind] kenmerk voor zowel de Create als Edit de actiemethoden bij om de Rating eigenschap op te nemen:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Werk de weergavesjablonen bij om de nieuwe Rating eigenschap in de browserweergave weer te geven, te maken en te bewerken.
Bewerk het /Views/Movies/Index.cshtml bestand en voeg een Rating veld toe:
<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>
Werk het /Views/Movies/Create.cshtml bij met een Rating veld.
U kunt de vorige 'formuliergroep' kopiëren/plakken en intelliSense de velden laten bijwerken. IntelliSense werkt met Tag Helpers.
Werk de resterende sjablonen bij.
Werk de SeedData-klasse bij zodat deze een waarde voor de nieuwe kolom biedt. Hieronder ziet u een voorbeeldwijziging, maar u wilt deze wijziging voor elke new Moviewijziging aanbrengen.
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
De app werkt pas als de database is bijgewerkt om het nieuwe veld op te nemen. Als deze nu wordt uitgevoerd, wordt het volgende SqlException gegenereerd:
SqlException: Invalid column name 'Rating'.
Deze fout treedt op omdat de bijgewerkte klasse Movie-model verschilt van het schema van de tabel Movie van de bestaande 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 op basis van het nieuwe modelklasseschema. Deze aanpak is erg handig vroeg in de ontwikkelingscyclus wanneer u actieve ontwikkeling uitvoert op een testdatabase; hiermee kunt u snel het model en databaseschema samen ontwikkelen. Het nadeel is echter dat u bestaande gegevens in de database kwijtraakt, dus u wilt deze benadering niet gebruiken voor een productiedatabase. Het gebruik van een initialisatiefunctie om automatisch een database te seeden met testgegevens is vaak een productieve manier om een toepassing te ontwikkelen. Dit is een goede aanpak voor vroege ontwikkeling en bij het gebruik van SQLite.
Wijzig het schema van de bestaande database expliciet zodat deze overeenkomt met de modelklassen. Het voordeel van deze aanpak is dat u uw gegevens bewaart. U kunt deze wijziging handmatig aanbrengen of door een databasewijzigingsscript te maken.
Gebruik Code First Migrations om het databaseschema bij te werken.
Voor deze zelfstudie wordt Code First Migrations gebruikt.
Selecteer in het menu ToolsNuGet Package Manager > Package Manager Console.
Voer in de PMC de volgende opdrachten in:
Add-Migration Rating
Update-Database
De Add-Migration opdracht vertelt het migratieframework om het huidige Movie model te onderzoeken met het huidige Movie DB-schema en de benodigde code te maken om de database 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.
Als alle records in de database worden verwijderd, wordt met de initialisatiemethode de database geseed en wordt het Rating veld opgenomen.
Voer de app uit en controleer of u films kunt maken, bewerken en weergeven met een Rating veld.
In deze sectie wordt Entity Framework Code First Migrations gebruikt om:
- Voeg een nieuw veld toe aan het model.
- Migreer het nieuwe veld naar de database.
Wanneer EF Code First wordt gebruikt om automatisch een database te maken, code first:
- Voegt een tabel toe aan de database om het schema van de database bij te houden.
- Controleert of de database gesynchroniseerd is met de modelklassen waaruit deze is gegenereerd. Als ze niet synchroon zijn, genereert EF een uitzondering. Dit maakt het gemakkelijker om inconsistente database-/codeproblemen te vinden.
Een classificatie-eigenschap toevoegen aan het filmmodel
Voeg een Rating eigenschap toe aan 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; }
}
}
De app bouwen
Ctrl+Shift+B
Omdat u een nieuw veld aan de Movie klasse hebt toegevoegd, moet u de lijst met eigenschappenbindingen bijwerken, zodat deze nieuwe eigenschap wordt opgenomen. Werk MoviesController.csin het [Bind] kenmerk voor zowel de Create als Edit de actiemethoden bij om de Rating eigenschap op te nemen:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Werk de weergavesjablonen bij om de nieuwe Rating eigenschap in de browserweergave weer te geven, te maken en te bewerken.
Bewerk het /Views/Movies/Index.cshtml bestand en voeg een Rating veld toe:
<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>
Werk het /Views/Movies/Create.cshtml bij met een Rating veld.
U kunt de vorige 'formuliergroep' kopiëren/plakken en intelliSense de velden laten bijwerken. IntelliSense werkt met Tag Helpers.
Werk de resterende sjablonen bij.
Werk de SeedData-klasse bij zodat deze een waarde voor de nieuwe kolom biedt. Hieronder ziet u een voorbeeldwijziging, maar u wilt deze wijziging voor elke new Moviewijziging aanbrengen.
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
De app werkt pas als de database is bijgewerkt om het nieuwe veld op te nemen. Als deze nu wordt uitgevoerd, wordt het volgende SqlException gegenereerd:
SqlException: Invalid column name 'Rating'.
Deze fout treedt op omdat de bijgewerkte klasse Movie-model verschilt van het schema van de tabel Movie van de bestaande 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 op basis van het nieuwe modelklasseschema. Deze aanpak is erg handig vroeg in de ontwikkelingscyclus wanneer u actieve ontwikkeling uitvoert op een testdatabase; hiermee kunt u snel het model en databaseschema samen ontwikkelen. Het nadeel is echter dat u bestaande gegevens in de database kwijtraakt, dus u wilt deze benadering niet gebruiken voor een productiedatabase. Het gebruik van een initialisatiefunctie om automatisch een database te seeden met testgegevens is vaak een productieve manier om een toepassing te ontwikkelen. Dit is een goede aanpak voor vroege ontwikkeling en bij het gebruik van SQLite.
Wijzig het schema van de bestaande database expliciet zodat deze overeenkomt met de modelklassen. Het voordeel van deze aanpak is dat u uw gegevens bewaart. U kunt deze wijziging handmatig aanbrengen of door een databasewijzigingsscript te maken.
Gebruik Code First Migrations om het databaseschema bij te werken.
Voor deze zelfstudie wordt Code First Migrations gebruikt.
Selecteer in het menu ToolsNuGet Package Manager > Package Manager Console.
Voer in de PMC de volgende opdrachten in:
Add-Migration Rating
Update-Database
De Add-Migration opdracht vertelt het migratieframework om het huidige Movie model te onderzoeken met het huidige Movie DB-schema en de benodigde code te maken om de database 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.
Als alle records in de database worden verwijderd, wordt met de initialisatiemethode de database geseed en wordt het Rating veld opgenomen.
Voer de app uit en controleer of u films kunt maken, bewerken en weergeven met een Rating veld.
In deze sectie wordt Entity Framework Code First Migrations gebruikt om:
- Voeg een nieuw veld toe aan het model.
- Migreer het nieuwe veld naar de database.
Wanneer EF Code First wordt gebruikt om automatisch een database te maken, code first:
- Voegt een tabel toe aan de database om het schema van de database bij te houden.
- Controleert of de database gesynchroniseerd is met de modelklassen waaruit deze is gegenereerd. Als ze niet synchroon zijn, genereert EF een uitzondering. Dit maakt het gemakkelijker om inconsistente database-/codeproblemen te vinden.
Een classificatie-eigenschap toevoegen aan het filmmodel
Voeg een Rating eigenschap toe aan 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; }
}
}
De app bouwen
Ctrl+Shift+B
Omdat u een nieuw veld aan de Movie klasse hebt toegevoegd, moet u de lijst met eigenschappenbindingen bijwerken, zodat deze nieuwe eigenschap wordt opgenomen. Werk MoviesController.csin het [Bind] kenmerk voor zowel de Create als Edit de actiemethoden bij om de Rating eigenschap op te nemen:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Werk de weergavesjablonen bij om de nieuwe Rating eigenschap in de browserweergave weer te geven, te maken en te bewerken.
Bewerk het /Views/Movies/Index.cshtml bestand en voeg een Rating veld toe:
<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>
Werk het /Views/Movies/Create.cshtml bij met een Rating veld.
U kunt de vorige 'formuliergroep' kopiëren/plakken en intelliSense de velden laten bijwerken. IntelliSense werkt met Tag Helpers.
Werk de resterende sjablonen bij.
Werk de SeedData-klasse bij zodat deze een waarde voor de nieuwe kolom biedt. Hieronder ziet u een voorbeeldwijziging, maar u wilt deze wijziging voor elke new Moviewijziging aanbrengen.
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
De app werkt pas als de database is bijgewerkt om het nieuwe veld op te nemen. Als deze nu wordt uitgevoerd, wordt het volgende SqlException gegenereerd:
SqlException: Invalid column name 'Rating'.
Deze fout treedt op omdat de bijgewerkte klasse Movie-model verschilt van het schema van de tabel Movie van de bestaande 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 op basis van het nieuwe modelklasseschema. Deze aanpak is erg handig vroeg in de ontwikkelingscyclus wanneer u actieve ontwikkeling uitvoert op een testdatabase; hiermee kunt u snel het model en databaseschema samen ontwikkelen. Het nadeel is echter dat u bestaande gegevens in de database kwijtraakt, dus u wilt deze benadering niet gebruiken voor een productiedatabase. Het gebruik van een initialisatiefunctie om automatisch een database te seeden met testgegevens is vaak een productieve manier om een toepassing te ontwikkelen. Dit is een goede aanpak voor vroege ontwikkeling en bij het gebruik van SQLite.
Wijzig het schema van de bestaande database expliciet zodat deze overeenkomt met de modelklassen. Het voordeel van deze aanpak is dat u uw gegevens bewaart. U kunt deze wijziging handmatig aanbrengen of door een databasewijzigingsscript te maken.
Gebruik Code First Migrations om het databaseschema bij te werken.
Voor deze zelfstudie wordt Code First Migrations gebruikt.
Selecteer in het menu ToolsNuGet Package Manager > Package Manager Console.
Voer in de PMC de volgende opdrachten in:
Add-Migration Rating
Update-Database
De Add-Migration opdracht vertelt het migratieframework om het huidige Movie model te onderzoeken met het huidige Movie DB-schema en de benodigde code te maken om de database 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.
Als alle records in de database worden verwijderd, wordt met de initialisatiemethode de database geseed en wordt het Rating veld opgenomen.
Voer de app uit en controleer of u films kunt maken, bewerken en weergeven met een Rating veld.
In deze sectie wordt Entity Framework Code First Migrations gebruikt om:
- Voeg een nieuw veld toe aan het model.
- Migreer het nieuwe veld naar de database.
Wanneer EF Code First wordt gebruikt om automatisch een database te maken, code first:
- Voegt een tabel toe aan de database om het schema van de database bij te houden.
- Controleert of de database gesynchroniseerd is met de modelklassen waaruit deze is gegenereerd. Als ze niet synchroon zijn, genereert EF een uitzondering. Dit maakt het gemakkelijker om inconsistente database-/codeproblemen te vinden.
Een classificatie-eigenschap toevoegen aan het filmmodel
Voeg een Rating eigenschap toe aan 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; }
}
}
De app bouwen
Ctrl+Shift+B
Omdat u een nieuw veld aan de Movie klasse hebt toegevoegd, moet u de lijst met eigenschappenbindingen bijwerken, zodat deze nieuwe eigenschap wordt opgenomen. Werk MoviesController.csin het [Bind] kenmerk voor zowel de Create als Edit de actiemethoden bij om de Rating eigenschap op te nemen:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Werk de weergavesjablonen bij om de nieuwe Rating eigenschap in de browserweergave weer te geven, te maken en te bewerken.
Bewerk het /Views/Movies/Index.cshtml bestand en voeg een Rating veld toe:
<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>
Werk het /Views/Movies/Create.cshtml bij met een Rating veld.
U kunt de vorige 'formuliergroep' kopiëren/plakken en intelliSense de velden laten bijwerken. IntelliSense werkt met Tag Helpers.
Werk de resterende sjablonen bij.
Werk de SeedData-klasse bij zodat deze een waarde voor de nieuwe kolom biedt. Hieronder ziet u een voorbeeldwijziging, maar u wilt deze wijziging voor elke new Moviewijziging aanbrengen.
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
De app werkt pas als de database is bijgewerkt om het nieuwe veld op te nemen. Als deze nu wordt uitgevoerd, wordt het volgende SqlException gegenereerd:
SqlException: Invalid column name 'Rating'.
Deze fout treedt op omdat de bijgewerkte klasse Movie-model verschilt van het schema van de tabel Movie van de bestaande 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 op basis van het nieuwe modelklasseschema. Deze aanpak is erg handig vroeg in de ontwikkelingscyclus wanneer u actieve ontwikkeling uitvoert op een testdatabase; hiermee kunt u snel het model en databaseschema samen ontwikkelen. Het nadeel is echter dat u bestaande gegevens in de database kwijtraakt, dus u wilt deze benadering niet gebruiken voor een productiedatabase. Het gebruik van een initialisatiefunctie om automatisch een database te seeden met testgegevens is vaak een productieve manier om een toepassing te ontwikkelen. Dit is een goede aanpak voor vroege ontwikkeling en bij het gebruik van SQLite.
Wijzig het schema van de bestaande database expliciet zodat deze overeenkomt met de modelklassen. Het voordeel van deze aanpak is dat u uw gegevens bewaart. U kunt deze wijziging handmatig aanbrengen of door een databasewijzigingsscript te maken.
Gebruik Code First Migrations om het databaseschema bij te werken.
Voor deze zelfstudie wordt Code First Migrations gebruikt.
Selecteer in het menu ToolsNuGet Package Manager > Package Manager Console.
Voer in de PMC de volgende opdrachten in:
Add-Migration Rating
Update-Database
De Add-Migration opdracht vertelt het migratieframework om het huidige Movie model te onderzoeken met het huidige Movie DB-schema en de benodigde code te maken om de database 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.
Als alle records in de database worden verwijderd, wordt met de initialisatiemethode de database geseed en wordt het Rating veld opgenomen.
Voer de app uit en controleer of u films kunt maken, bewerken en weergeven met een Rating veld.