Část 7: Přidání nového pole na Razor stránku v ASP.NET Core
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v tématu .NET a .NET Core Zásady podpory. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.
Důležité
Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Aktuální verzi najdete ve verzi .NET 8 tohoto článku.
Autor: Rick Anderson
V této části se Entity Framework Core (EF Core) používá k definování schématu databáze na základě třídy modelu aplikace:
- Přidejte do modelu nové pole.
- Migrace nové změny schématu pole do databáze
Přístup EF Core umožňuje agilnější proces vývoje. Vývojář pracuje na datovém modelu aplikace přímo při vytváření a synchronizaci schématu databáze, a to vše bez nutnosti přepínat kontexty do a z nástroje pro správu datbase. Přehled entity Framework Core a jeho výhod najdete v tématu Entity Framework Core.
Použití EF Code k automatickému vytvoření a sledování databáze:
__EFMigrationsHistory
Přidá do databáze tabulku, která sleduje, jestli je schéma databáze synchronizované s třídami modelu, ze které byl vygenerován.- Vyvolá výjimku, pokud se třídy modelu nesynchronizují s databází.
Automatické ověření, že schéma a model jsou synchronizované, usnadňuje nalezení nekonzistentních problémů s kódem databáze.
Přidání vlastnosti hodnocení do filmového modelu
Models/Movie.cs
Otevřete soubor a přidejteRating
vlastnost: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; }
Upravit
Pages/Movies/Index.cshtml
a přidatRating
pole:@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>
Aktualizujte následující stránky pomocí
Rating
pole:
Aplikace nebude fungovat, dokud se databáze neaktualizuje tak, aby zahrnovala nové pole. Spuštění aplikace bez aktualizace databáze vyvolá SqlException
následující:
SqlException: Invalid column name 'Rating'.
Výjimka SqlException
je způsobena aktualizovanou třídou modelu Movie, která se liší od schématu tabulky Movie databáze. V tabulce databáze není žádný Rating
sloupec.
K vyřešení chyby existuje několik přístupů:
- Rozhraní Entity Framework automaticky vyřaďte a znovu vytvořte databázi pomocí nového schématu třídy modelu. Tento přístup je pohodlný v rané fázi vývojového cyklu, umožňuje vývojářům rychle vyvíjet schéma modelu a databáze společně. Nevýhodou je ztráta existujících dat v databázi. Nepoužívejte tento přístup v produkční databázi. Vyřazení databáze na změny schématu a použití inicializátoru k automatickému sesílání databáze s testovacími daty je často produktivní způsob vývoje aplikace.
- Explicitně upravte schéma existující databáze tak, aby odpovídalo třídám modelu. Výhodou tohoto přístupu je zachování dat. Tuto změnu proveďte buď ručně, nebo vytvořením skriptu pro změnu databáze.
- Pomocí EF Core migrací aktualizujte schéma databáze.
Pro účely tohoto kurzu použijte EF Core migrace.
Aktualizujte SeedData
třídu tak, aby poskytovala hodnotu pro nový sloupec. Ukázková změna se zobrazí níže, ale proveďte tuto změnu pro každý 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"
},
Podívejte se na dokončený SeedData.cs soubor.
Vytvoření aplikace
Stiskněte kombinaci kláves Ctrl+Shift+B.
Přidání migrace pro pole hodnocení
V nabídce Nástroje vyberte Správce balíčků konzolu NuGet > Správce balíčků.
V konzole Správce balíčků (PMC) zadejte následující příkaz:
Add-Migration Rating
Příkaz Add-Migration
říká rozhraní, aby:
Movie
Porovnejte model se schématemMovie
databáze.- Vytvořte kód pro migraci schématu databáze do nového modelu.
Název Hodnocení je libovolný a slouží k pojmenování souboru migrace. Pro soubor migrace je užitečné použít smysluplný název.
V PMC zadejte následující příkaz:
Update-Database
Příkaz Update-Database
říká rozhraní, aby použil změny schématu v databázi a zachoval existující data.
Odstraňte všechny záznamy v databázi, inicializátor se vloží do databáze a zahrne pole Rating
. Odstranění je možné provést pomocí odkazů pro odstranění v prohlížeči nebo z sql serveru Průzkumník objektů (SSOX).
Další možností je odstranit databázi a použít migrace k opětovnému vytvoření databáze. Odstranění databáze v SSOX:
Vyberte databázi v SSOX.
Klikněte pravým tlačítkem myši na databázi a vyberte Odstranit.
Zaškrtněte políčko Zavřít existující připojení.
Vyberte OK.
V PMC aktualizujte databázi:
Update-Database
Spusťte aplikaci a ověřte, že můžete vytvářet, upravovat a zobrazovat filmy s polem Rating
. Pokud databáze není počáteční, nastavte v SeedData.Initialize
metodě zarážku.
Další kroky
V této části Migrace Code First Entity Framework slouží k:
- Přidejte do modelu nové pole.
- Migrace nové změny schématu pole do databáze
Při použití EF Code First k automatickému vytvoření a sledování databáze, Code First:
__EFMigrationsHistory
Přidá do databáze tabulku, která sleduje, jestli je schéma databáze synchronizované s třídami modelu, ze které byl vygenerován.- Vyvolá výjimku, pokud se třídy modelu nesynchronizují s databází.
Automatické ověření, že schéma a model jsou synchronizované, usnadňuje nalezení nekonzistentních problémů s kódem databáze.
Přidání vlastnosti hodnocení do filmového modelu
Models/Movie.cs
Otevřete soubor a přidejteRating
vlastnost: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; }
Upravit
Pages/Movies/Index.cshtml
a přidatRating
pole:@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>
Aktualizujte následující stránky pomocí
Rating
pole:
Aplikace nebude fungovat, dokud se databáze neaktualizuje tak, aby zahrnovala nové pole. Spuštění aplikace bez aktualizace databáze vyvolá SqlException
následující:
SqlException: Invalid column name 'Rating'.
Výjimka SqlException
je způsobena aktualizovanou třídou modelu Movie, která se liší od schématu tabulky Movie databáze. V tabulce databáze není žádný Rating
sloupec.
K vyřešení chyby existuje několik přístupů:
- Rozhraní Entity Framework automaticky vyřaďte a znovu vytvořte databázi pomocí nového schématu třídy modelu. Tento přístup je pohodlný v rané fázi vývojového cyklu, umožňuje vývojářům rychle vyvíjet schéma modelu a databáze společně. Nevýhodou je ztráta existujících dat v databázi. Nepoužívejte tento přístup v produkční databázi. Vyřazení databáze na změny schématu a použití inicializátoru k automatickému sesílání databáze s testovacími daty je často produktivní způsob vývoje aplikace.
- Explicitně upravte schéma existující databáze tak, aby odpovídalo třídám modelu. Výhodou tohoto přístupu je zachování dat. Tuto změnu proveďte buď ručně, nebo vytvořením skriptu pro změnu databáze.
- K aktualizaci schématu databáze použijte Migrace Code First.
Pro účely tohoto kurzu použijte Migrace Code First.
Aktualizujte SeedData
třídu tak, aby poskytovala hodnotu pro nový sloupec. Ukázková změna se zobrazí níže, ale proveďte tuto změnu pro každý 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"
},
Podívejte se na dokončený SeedData.cs soubor.
Vytvoření aplikace
Stiskněte kombinaci kláves Ctrl+Shift+B.
Přidání migrace pro pole hodnocení
V nabídce Nástroje vyberte Správce balíčků konzolu NuGet > Správce balíčků.
V PMC zadejte následující příkazy:
Add-Migration Rating Update-Database
Příkaz Add-Migration
říká rozhraní, aby:
Movie
Porovnejte model se schématemMovie
databáze.- Vytvořte kód pro migraci schématu databáze do nového modelu.
Název Hodnocení je libovolný a slouží k pojmenování souboru migrace. Pro soubor migrace je užitečné použít smysluplný název.
Příkaz Update-Database
říká rozhraní, aby použil změny schématu v databázi a zachoval existující data.
Odstraňte všechny záznamy v databázi, inicializátor se vloží do databáze a zahrne pole Rating
. Odstranění je možné provést pomocí odkazů pro odstranění v prohlížeči nebo z sql serveru Průzkumník objektů (SSOX).
Další možností je odstranit databázi a použít migrace k opětovnému vytvoření databáze. Odstranění databáze v SSOX:
Vyberte databázi v SSOX.
Klikněte pravým tlačítkem myši na databázi a vyberte Odstranit.
Zaškrtněte políčko Zavřít existující připojení.
Vyberte OK.
V PMC aktualizujte databázi:
Update-Database
Spusťte aplikaci a ověřte, že můžete vytvářet, upravovat a zobrazovat filmy s polem Rating
. Pokud databáze není počáteční, nastavte v SeedData.Initialize
metodě zarážku.
Další kroky
V této části Migrace Code First Entity Framework slouží k:
- Přidejte do modelu nové pole.
- Migrace nové změny schématu pole do databáze
Při použití EF Code First k automatickému vytvoření a sledování databáze, Code First:
__EFMigrationsHistory
Přidá do databáze tabulku, která sleduje, jestli je schéma databáze synchronizované s třídami modelu, ze které byl vygenerován.- Vyvolá výjimku, pokud se třídy modelu nesynchronizují s databází.
Automatické ověření, že schéma a model jsou synchronizované, usnadňuje nalezení nekonzistentních problémů s kódem databáze.
Přidání vlastnosti hodnocení do filmového modelu
Models/Movie.cs
Otevřete soubor a přidejteRating
vlastnost: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; }
Upravit
Pages/Movies/Index.cshtml
a přidatRating
pole:@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>
Aktualizujte následující stránky pomocí
Rating
pole:
Aplikace nebude fungovat, dokud se databáze neaktualizuje tak, aby zahrnovala nové pole. Spuštění aplikace bez aktualizace databáze vyvolá SqlException
následující:
SqlException: Invalid column name 'Rating'.
Výjimka SqlException
je způsobena aktualizovanou třídou modelu Movie, která se liší od schématu tabulky Movie databáze. V tabulce databáze není žádný Rating
sloupec.
K vyřešení chyby existuje několik přístupů:
- Rozhraní Entity Framework automaticky vyřaďte a znovu vytvořte databázi pomocí nového schématu třídy modelu. Tento přístup je pohodlný v rané fázi vývojového cyklu, umožňuje vývojářům rychle vyvíjet schéma modelu a databáze společně. Nevýhodou je ztráta existujících dat v databázi. Nepoužívejte tento přístup v produkční databázi. Vyřazení databáze na změny schématu a použití inicializátoru k automatickému sesílání databáze s testovacími daty je často produktivní způsob vývoje aplikace.
- Explicitně upravte schéma existující databáze tak, aby odpovídalo třídám modelu. Výhodou tohoto přístupu je zachování dat. Tuto změnu proveďte buď ručně, nebo vytvořením skriptu pro změnu databáze.
- K aktualizaci schématu databáze použijte Migrace Code First.
Pro účely tohoto kurzu použijte Migrace Code First.
Aktualizujte SeedData
třídu tak, aby poskytovala hodnotu pro nový sloupec. Ukázková změna se zobrazí níže, ale proveďte tuto změnu pro každý 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"
},
Podívejte se na dokončený SeedData.cs soubor.
Vytvoření aplikace
Stiskněte kombinaci kláves Ctrl+Shift+B.
Přidání migrace pro pole hodnocení
V nabídce Nástroje vyberte Správce balíčků konzolu NuGet > Správce balíčků.
V PMC zadejte následující příkazy:
Add-Migration Rating Update-Database
Příkaz Add-Migration
říká rozhraní, aby:
Movie
Porovnejte model se schématemMovie
databáze.- Vytvořte kód pro migraci schématu databáze do nového modelu.
Název Hodnocení je libovolný a slouží k pojmenování souboru migrace. Pro soubor migrace je užitečné použít smysluplný název.
Příkaz Update-Database
říká rozhraní, aby použil změny schématu v databázi a zachoval existující data.
Odstraňte všechny záznamy v databázi, inicializátor se vloží do databáze a zahrne pole Rating
. Odstranění je možné provést pomocí odkazů pro odstranění v prohlížeči nebo z sql serveru Průzkumník objektů (SSOX).
Další možností je odstranit databázi a použít migrace k opětovnému vytvoření databáze. Odstranění databáze v SSOX:
Vyberte databázi v SSOX.
Klikněte pravým tlačítkem myši na databázi a vyberte Odstranit.
Zaškrtněte políčko Zavřít existující připojení.
Vyberte OK.
V PMC aktualizujte databázi:
Update-Database
Spusťte aplikaci a ověřte, že můžete vytvářet, upravovat a zobrazovat filmy s polem Rating
. Pokud databáze není počáteční, nastavte v SeedData.Initialize
metodě zarážku.
Další kroky
V této části Migrace Code First Entity Framework slouží k:
- Přidejte do modelu nové pole.
- Migrace nové změny schématu pole do databáze
Při použití EF Code First k automatickému vytvoření a sledování databáze, Code First:
__EFMigrationsHistory
Přidá do databáze tabulku, která sleduje, jestli je schéma databáze synchronizované s třídami modelu, ze které byl vygenerován.- Vyvolá výjimku, pokud se třídy modelu nesynchronizují s databází.
Automatické ověření, že schéma a model jsou synchronizované, usnadňuje nalezení nekonzistentních problémů s kódem databáze.
Přidání vlastnosti hodnocení do filmového modelu
Models/Movie.cs
Otevřete soubor a přidejteRating
vlastnost: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; }
Upravit
Pages/Movies/Index.cshtml
a přidatRating
pole:@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>
Aktualizujte následující stránky pomocí
Rating
pole:
Aplikace nebude fungovat, dokud se databáze neaktualizuje tak, aby zahrnovala nové pole. Spuštění aplikace bez aktualizace databáze vyvolá SqlException
následující:
SqlException: Invalid column name 'Rating'.
Výjimka SqlException
je způsobena aktualizovanou třídou modelu Movie, která se liší od schématu tabulky Movie databáze. V tabulce databáze není žádný Rating
sloupec.
K vyřešení chyby existuje několik přístupů:
- Rozhraní Entity Framework automaticky vyřaďte a znovu vytvořte databázi pomocí nového schématu třídy modelu. Tento přístup je pohodlný v rané fázi vývojového cyklu, umožňuje vývojářům rychle vyvíjet schéma modelu a databáze společně. Nevýhodou je ztráta existujících dat v databázi. Nepoužívejte tento přístup v produkční databázi. Vyřazení databáze na změny schématu a použití inicializátoru k automatickému sesílání databáze s testovacími daty je často produktivní způsob vývoje aplikace.
- Explicitně upravte schéma existující databáze tak, aby odpovídalo třídám modelu. Výhodou tohoto přístupu je zachování dat. Tuto změnu proveďte buď ručně, nebo vytvořením skriptu pro změnu databáze.
- K aktualizaci schématu databáze použijte Migrace Code First.
Pro účely tohoto kurzu použijte Migrace Code First.
Aktualizujte SeedData
třídu tak, aby poskytovala hodnotu pro nový sloupec. Ukázková změna se zobrazí níže, ale proveďte tuto změnu pro každý 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"
},
Podívejte se na dokončený SeedData.cs soubor.
Sestavte řešení.
Přidání migrace pro pole hodnocení
V nabídce Nástroje vyberte Správce balíčků konzolu NuGet > Správce balíčků.
V PMC zadejte následující příkazy:
Add-Migration Rating Update-Database
Příkaz Add-Migration
říká rozhraní, aby:
Movie
Porovnejte model se schématemMovie
databáze.- Vytvořte kód pro migraci schématu databáze do nového modelu.
Název Hodnocení je libovolný a slouží k pojmenování souboru migrace. Pro soubor migrace je užitečné použít smysluplný název.
Příkaz Update-Database
říká rozhraní, aby použil změny schématu v databázi a zachoval existující data.
Odstraňte všechny záznamy v databázi, inicializátor se vloží do databáze a zahrne pole Rating
. Odstranění je možné provést pomocí odkazů pro odstranění v prohlížeči nebo z sql serveru Průzkumník objektů (SSOX).
Další možností je odstranit databázi a použít migrace k opětovnému vytvoření databáze. Odstranění databáze v SSOX:
Vyberte databázi v SSOX.
Klikněte pravým tlačítkem myši na databázi a vyberte Odstranit.
Zaškrtněte políčko Zavřít existující připojení.
Vyberte OK.
V PMC aktualizujte databázi:
Update-Database
Spusťte aplikaci a ověřte, že můžete vytvářet, upravovat a zobrazovat filmy s polem Rating
. Pokud databáze není počáteční, nastavte v SeedData.Initialize
metodě zarážku.
Další kroky
Zobrazení nebo stažení vzorového kódu (postup stažení)
V této části Migrace Code First Entity Framework slouží k:
- Přidejte do modelu nové pole.
- Migrace nové změny schématu pole do databáze
Při použití EF Code First k automatickému vytvoření databáze, Code First:
__EFMigrationsHistory
Přidá do databáze tabulku, která sleduje, jestli je schéma databáze synchronizované s třídami modelu, ze které byl vygenerován.- Pokud se třídy modelu nesynchronizují s databází, ef vyvolá výjimku.
Automatické ověření, že schéma a model jsou synchronizované, usnadňuje nalezení nekonzistentních problémů s kódem databáze.
Přidání vlastnosti hodnocení do filmového modelu
Models/Movie.cs
Otevřete soubor a přidejteRating
vlastnost: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; } }
Sestavení aplikace
Upravit
Pages/Movies/Index.cshtml
a přidatRating
pole:@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>
Aktualizujte následující stránky pomocí
Rating
pole:
Aplikace nebude fungovat, dokud se databáze neaktualizuje tak, aby zahrnovala nové pole. Spuštění aplikace bez aktualizace databáze vyvolá SqlException
následující:
SqlException: Invalid column name 'Rating'.
Výjimka SqlException
je způsobena aktualizovanou třídou modelu Movie, která se liší od schématu tabulky Movie databáze. V tabulce databáze není žádný Rating
sloupec.
K vyřešení chyby existuje několik přístupů:
Rozhraní Entity Framework automaticky vyřaďte a znovu vytvořte databázi pomocí nového schématu třídy modelu. Tento přístup je pohodlný v rané fázi vývojového cyklu, umožňuje rychle vyvíjet schéma modelu a databáze společně. Nevýhodou je, že ztratíte stávající data v databázi. Nepoužívejte tento přístup v produkční databázi. Vyřazení databáze na změny schématu a použití inicializátoru k automatickému sesílání databáze s testovacími daty je často produktivní způsob vývoje aplikace.
Explicitně upravte schéma existující databáze tak, aby odpovídalo třídám modelu. Výhodou tohoto přístupu je zachování dat. Tuto změnu proveďte buď ručně, nebo vytvořením skriptu pro změnu databáze.
K aktualizaci schématu databáze použijte Migrace Code First.
Pro účely tohoto kurzu použijte Migrace Code First.
Aktualizujte SeedData
třídu tak, aby poskytovala hodnotu pro nový sloupec. Ukázková změna se zobrazí níže, ale proveďte tuto změnu pro každý 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"
},
Podívejte se na dokončený SeedData.cs soubor.
Sestavte řešení.
Přidání migrace pro pole hodnocení
V nabídce Nástroje vyberte Správce balíčků konzolu NuGet > Správce balíčků.
V PMC zadejte následující příkazy:
Add-Migration Rating Update-Database
Příkaz Add-Migration
říká rozhraní, aby:
Movie
Porovnejte model se schématemMovie
databáze.- Vytvořte kód pro migraci schématu databáze do nového modelu.
Název Hodnocení je libovolný a slouží k pojmenování souboru migrace. Pro soubor migrace je užitečné použít smysluplný název.
Příkaz Update-Database
říká rozhraní, aby použil změny schématu v databázi a zachoval existující data.
Odstraňte všechny záznamy v databázi, inicializátor se vloží do databáze a zahrne pole Rating
. Odstranění je možné provést pomocí odkazů pro odstranění v prohlížeči nebo z sql serveru Průzkumník objektů (SSOX).
Další možností je odstranit databázi a použít migrace k opětovnému vytvoření databáze. Odstranění databáze v SSOX:
Vyberte databázi v SSOX.
Klikněte pravým tlačítkem myši na databázi a vyberte Odstranit.
Zaškrtněte políčko Zavřít existující připojení.
Vyberte OK.
V PMC aktualizujte databázi:
Update-Database
Spusťte aplikaci a ověřte, že můžete vytvářet, upravovat a zobrazovat filmy s polem Rating
. Pokud databáze není počáteční, nastavte v SeedData.Initialize
metodě zarážku.
Další kroky
Zobrazení nebo stažení vzorového kódu (postup stažení)
V této části Migrace Code First Entity Framework slouží k:
- Přidejte do modelu nové pole.
- Migrace nové změny schématu pole do databáze
Při použití EF Code First k automatickému vytvoření databáze, Code First:
__EFMigrationsHistory
Přidá do databáze tabulku, která sleduje, jestli je schéma databáze synchronizované s třídami modelu, ze které byl vygenerován.- Pokud se třídy modelu nesynchronizují s databází, ef vyvolá výjimku.
Automatické ověření, že schéma a model jsou synchronizované, usnadňuje nalezení nekonzistentních problémů s kódem databáze.
Přidání vlastnosti hodnocení do filmového modelu
Models/Movie.cs
Otevřete soubor a přidejteRating
vlastnost: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; } }
Sestavení aplikace
Upravit
Pages/Movies/Index.cshtml
a přidatRating
pole:@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>
Aktualizujte následující stránky pomocí
Rating
pole:
Aplikace nebude fungovat, dokud se databáze neaktualizuje tak, aby zahrnovala nové pole. Spuštění aplikace bez aktualizace databáze vyvolá SqlException
následující:
SqlException: Invalid column name 'Rating'.
Výjimka SqlException
je způsobena aktualizovanou třídou modelu Movie, která se liší od schématu tabulky Movie databáze. V tabulce databáze není žádný Rating
sloupec.
K vyřešení chyby existuje několik přístupů:
Rozhraní Entity Framework automaticky vyřaďte a znovu vytvořte databázi pomocí nového schématu třídy modelu. Tento přístup je pohodlný v rané fázi vývojového cyklu, umožňuje rychle vyvíjet schéma modelu a databáze společně. Nevýhodou je, že ztratíte stávající data v databázi. Nepoužívejte tento přístup v produkční databázi. Vyřazení databáze na změny schématu a použití inicializátoru k automatickému sesílání databáze s testovacími daty je často produktivní způsob vývoje aplikace.
Explicitně upravte schéma existující databáze tak, aby odpovídalo třídám modelu. Výhodou tohoto přístupu je zachování dat. Tuto změnu proveďte buď ručně, nebo vytvořením skriptu pro změnu databáze.
K aktualizaci schématu databáze použijte Migrace Code First.
Pro účely tohoto kurzu použijte Migrace Code First.
Aktualizujte SeedData
třídu tak, aby poskytovala hodnotu pro nový sloupec. Ukázková změna se zobrazí níže, ale proveďte tuto změnu pro každý 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"
},
Podívejte se na dokončený SeedData.cs soubor.
Sestavte řešení.
Přidání migrace pro pole hodnocení
V nabídce Nástroje vyberte Správce balíčků konzolu NuGet > Správce balíčků.
V PMC zadejte následující příkazy:
Add-Migration Rating Update-Database
Příkaz Add-Migration
říká rozhraní, aby:
Movie
Porovnejte model se schématemMovie
databáze.- Vytvořte kód pro migraci schématu databáze do nového modelu.
Název Hodnocení je libovolný a slouží k pojmenování souboru migrace. Pro soubor migrace je užitečné použít smysluplný název.
Příkaz Update-Database
říká rozhraní, aby použil změny schématu v databázi a zachoval existující data.
Pokud odstraníte všechny záznamy v databázi, inicializátor zasadí databázi a zahrne pole Rating
. Můžete to udělat pomocí odkazů pro odstranění v prohlížeči nebo z sql serveru Průzkumník objektů (SSOX).
Další možností je odstranit databázi a použít migrace k opětovnému vytvoření databáze. Odstranění databáze v SSOX:
Vyberte databázi v SSOX.
Klikněte pravým tlačítkem myši na databázi a vyberte Odstranit.
Zaškrtněte políčko Zavřít existující připojení.
Vyberte OK.
V PMC aktualizujte databázi:
Update-Database
Spusťte aplikaci a ověřte, že můžete vytvářet, upravovat a zobrazovat filmy s polem Rating
. Pokud databáze není počáteční, nastavte v SeedData.Initialize
metodě zarážku.