Část 8: Přidání nového pole do aplikace ASP.NET Core MVC
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
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 v tomto článku ve verzi .NET 9.
Autor: Rick Anderson
V této části se migrace Entity Framework používají k:
- Přidejte do modelu nové pole.
- Migrujte nové pole do databáze.
Pokud se entity Framework (EF) používá k automatickému vytvoření databáze z tříd modelů:
- Do databáze se přidá tabulka pro sledování schématu databáze.
- Databáze je ověřena tak, aby byla synchronizovaná s třídami modelu, ze které byla vygenerována. Pokud nejsou synchronizované, ef vyvolá výjimku. To usnadňuje nalezení nekonzistentních problémů s databází nebo kódem.
Přidání vlastnosti hodnocení do filmového modelu
Rating
Přidat vlastnost doModels/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; }
}
Vytvoření aplikace
Stiskněte kombinaci kláves Ctrl+Shift+B.
Protože jste do Movie
třídy přidali nové pole, musíte aktualizovat seznam vazeb vlastností, aby tato nová vlastnost byla zahrnuta. V MoviesController.cs
, aktualizovat [Bind]
atribut pro obě Create
metody Edit
akce zahrnout Rating
vlastnost:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Aktualizujte šablony zobrazení, aby se zobrazila, vytvořila a upravila nová Rating
vlastnost v zobrazení prohlížeče.
/Views/Movies/Index.cshtml
Upravte soubor a přidejte Rating
pole:
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Rating)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Movies!)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.DisplayFor(modelItem => item.Rating)
</td>
<td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
Aktualizujte /Views/Movies/Create.cshtml
pole.Rating
Předchozí skupinu formulářů můžete zkopírovat nebo vložit a nechat intelliSense, aby vám pomohla aktualizovat pole. IntelliSense funguje s pomocnými rutinami značek.
Rating
Přidejte vlastnost do zbývajících Create.cshtml
šablon , Delete.cshtml
Details.cshtml
, a Edit.cshtml
zobrazit šablony.
Aktualizujte SeedData
třídu tak, aby poskytovala hodnotu pro nový sloupec. Níže je uvedena ukázková změna, ale pro každou z nich new Movie
budete chtít provést tuto změnu .
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
Aplikace nebude fungovat, dokud se databáze neaktualizuje tak, aby zahrnovala nové pole. Pokud je teď spuštěný, zobrazí se následující SqlException
:
SqlException: Invalid column name 'Rating'.
K této chybě dochází, protože aktualizovaná třída modelu Movie se liší od schématu tabulky Movie existující 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 na základě nového schématu třídy modelu. Tento přístup je velmi pohodlný v rané fázi vývojového cyklu, když provádíte aktivní vývoj v testovací databázi; umožňuje rychle vyvíjet schéma modelu a databáze společně. Nevýhodou ale je, že ztratíte stávající data v databázi , takže tento přístup nechcete používat v produkční databázi! Použití inicializátoru k automatickému sesílování databáze s testovacími daty je často produktivní způsob vývoje aplikace. Tento přístup je vhodný pro raný vývoj a při použití SQLite.
Explicitně upravte schéma existující databáze tak, aby odpovídalo třídám modelu. Výhodou tohoto přístupu je, že data uchováváte. Tuto změnu můžete provést ručně nebo vytvořením skriptu pro změnu databáze.
K aktualizaci schématu databáze použijte migrace entity Framework.
Pro účely tohoto kurzu se používají migrace entity Framework.
V nabídce Nástroje vyberte Správce balíčků konzolu NuGet > Správce balíčků.
V konzole Správce balíčků zadejte následující příkaz:
Add-Migration Rating
Příkaz Add-Migration
informuje architekturu migrace, aby prozkoumal aktuální Movie
model s aktuálním Movie
schématem databáze a vytvořil potřebný kód pro migraci 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.
Pokud jsou odstraněny všechny záznamy v databázi, inicializace metoda zasadí databázi a zahrne Rating
pole.
V konzole Správce balíčků zadejte následující příkaz:
Update-Database
Příkaz Update-Database spustí metodu Up v migracích, které nebyly použity.
Spusťte aplikaci a ověřte, že můžete vytvářet, upravovat a zobrazovat filmy s polem Rating
.
V této části Migrace Code First Entity Framework slouží k:
- Přidejte do modelu nové pole.
- Migrujte nové pole do databáze.
Když se ef Code First použije k automatickému vytvoření databáze, Code First:
- Přidá do databáze tabulku pro sledování schématu databáze.
- Ověřuje, že databáze je synchronizovaná s třídami modelu, ze které byla vygenerována. Pokud nejsou synchronizované, ef vyvolá výjimku. To usnadňuje nalezení nekonzistentních problémů s databází nebo kódem.
Přidání vlastnosti hodnocení do filmového modelu
Rating
Přidat vlastnost doModels/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; }
}
Vytvoření aplikace
Stiskněte kombinaci kláves Ctrl+Shift+B.
Protože jste do Movie
třídy přidali nové pole, musíte aktualizovat seznam vazeb vlastností, aby tato nová vlastnost byla zahrnuta. V MoviesController.cs
, aktualizovat [Bind]
atribut pro obě Create
metody Edit
akce zahrnout Rating
vlastnost:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Aktualizujte šablony zobrazení, aby se zobrazila, vytvořila a upravila nová Rating
vlastnost v zobrazení prohlížeče.
/Views/Movies/Index.cshtml
Upravte soubor a přidejte Rating
pole:
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Rating)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Movies!)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.DisplayFor(modelItem => item.Rating)
</td>
<td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
Aktualizujte /Views/Movies/Create.cshtml
pole.Rating
Předchozí skupinu formulářů můžete zkopírovat nebo vložit a nechat intelliSense, aby vám pomohla aktualizovat pole. IntelliSense funguje s pomocnými rutinami značek.
Aktualizujte zbývající šablony.
Aktualizujte SeedData
třídu tak, aby poskytovala hodnotu pro nový sloupec. Níže je uvedena ukázková změna, ale pro každou z nich new Movie
budete chtít provést tuto změnu .
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
Aplikace nebude fungovat, dokud se databáze neaktualizuje tak, aby zahrnovala nové pole. Pokud je teď spuštěný, zobrazí se následující SqlException
:
SqlException: Invalid column name 'Rating'.
K této chybě dochází, protože aktualizovaná třída modelu Movie se liší od schématu tabulky Movie existující 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 na základě nového schématu třídy modelu. Tento přístup je velmi pohodlný v rané fázi vývojového cyklu, když provádíte aktivní vývoj v testovací databázi; umožňuje rychle vyvíjet schéma modelu a databáze společně. Nevýhodou ale je, že ztratíte stávající data v databázi , takže tento přístup nechcete používat v produkční databázi! Použití inicializátoru k automatickému sesílování databáze s testovacími daty je často produktivní způsob vývoje aplikace. Tento přístup je vhodný pro raný vývoj a při použití SQLite.
Explicitně upravte schéma existující databáze tak, aby odpovídalo třídám modelu. Výhodou tohoto přístupu je, že data uchováváte. Tuto změnu můžete provést 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 se používá Migrace Code First.
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
informuje architekturu migrace, aby prozkoumal aktuální Movie
model s aktuálním Movie
schématem databáze a vytvořil potřebný kód pro migraci 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.
Pokud jsou odstraněny všechny záznamy v databázi, inicializace metoda zasadí databázi a zahrne Rating
pole.
Spusťte aplikaci a ověřte, že můžete vytvářet, upravovat a zobrazovat filmy s polem Rating
.
V této části Migrace Code First Entity Framework slouží k:
- Přidejte do modelu nové pole.
- Migrujte nové pole do databáze.
Když se ef Code First použije k automatickému vytvoření databáze, Code First:
- Přidá do databáze tabulku pro sledování schématu databáze.
- Ověřuje, že databáze je synchronizovaná s třídami modelu, ze které byla vygenerována. Pokud nejsou synchronizované, ef vyvolá výjimku. To usnadňuje nalezení nekonzistentních problémů s databází nebo kódem.
Přidání vlastnosti hodnocení do filmového modelu
Rating
Přidat vlastnost doModels/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; }
}
Vytvoření aplikace
Stiskněte kombinaci kláves Ctrl+Shift+B.
Protože jste do Movie
třídy přidali nové pole, musíte aktualizovat seznam vazeb vlastností, aby tato nová vlastnost byla zahrnuta. V MoviesController.cs
, aktualizovat [Bind]
atribut pro obě Create
metody Edit
akce zahrnout Rating
vlastnost:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Aktualizujte šablony zobrazení, aby se zobrazila, vytvořila a upravila nová Rating
vlastnost v zobrazení prohlížeče.
/Views/Movies/Index.cshtml
Upravte soubor a přidejte Rating
pole:
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Rating)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Movies!)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.DisplayFor(modelItem => item.Rating)
</td>
<td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
Aktualizujte /Views/Movies/Create.cshtml
pole.Rating
Předchozí skupinu formulářů můžete zkopírovat nebo vložit a nechat intelliSense, aby vám pomohla aktualizovat pole. IntelliSense funguje s pomocnými rutinami značek.
Aktualizujte zbývající šablony.
Aktualizujte SeedData
třídu tak, aby poskytovala hodnotu pro nový sloupec. Níže je uvedena ukázková změna, ale pro každou z nich new Movie
budete chtít provést tuto změnu .
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
Aplikace nebude fungovat, dokud se databáze neaktualizuje tak, aby zahrnovala nové pole. Pokud je teď spuštěný, zobrazí se následující SqlException
:
SqlException: Invalid column name 'Rating'.
K této chybě dochází, protože aktualizovaná třída modelu Movie se liší od schématu tabulky Movie existující 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 na základě nového schématu třídy modelu. Tento přístup je velmi pohodlný v rané fázi vývojového cyklu, když provádíte aktivní vývoj v testovací databázi; umožňuje rychle vyvíjet schéma modelu a databáze společně. Nevýhodou ale je, že ztratíte stávající data v databázi , takže tento přístup nechcete používat v produkční databázi! Použití inicializátoru k automatickému sesílování databáze s testovacími daty je často produktivní způsob vývoje aplikace. Tento přístup je vhodný pro raný vývoj a při použití SQLite.
Explicitně upravte schéma existující databáze tak, aby odpovídalo třídám modelu. Výhodou tohoto přístupu je, že data uchováváte. Tuto změnu můžete provést 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 se používá Migrace Code First.
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
informuje architekturu migrace, aby prozkoumal aktuální Movie
model s aktuálním Movie
schématem databáze a vytvořil potřebný kód pro migraci 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.
Pokud jsou odstraněny všechny záznamy v databázi, inicializace metoda zasadí databázi a zahrne Rating
pole.
Spusťte aplikaci a ověřte, že můžete vytvářet, upravovat a zobrazovat filmy s polem Rating
.
V této části Migrace Code First Entity Framework slouží k:
- Přidejte do modelu nové pole.
- Migrujte nové pole do databáze.
Když se ef Code First použije k automatickému vytvoření databáze, Code First:
- Přidá do databáze tabulku pro sledování schématu databáze.
- Ověřuje, že databáze je synchronizovaná s třídami modelu, ze které byla vygenerována. Pokud nejsou synchronizované, ef vyvolá výjimku. To usnadňuje nalezení nekonzistentních problémů s databází nebo kódem.
Přidání vlastnosti hodnocení do filmového modelu
Rating
Přidat vlastnost doModels/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; }
}
}
Vytvoření aplikace
Ctrl+Shift+B
Protože jste do Movie
třídy přidali nové pole, musíte aktualizovat seznam vazeb vlastností, aby tato nová vlastnost byla zahrnuta. V MoviesController.cs
, aktualizovat [Bind]
atribut pro obě Create
metody Edit
akce zahrnout Rating
vlastnost:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Aktualizujte šablony zobrazení, aby se zobrazila, vytvořila a upravila nová Rating
vlastnost v zobrazení prohlížeče.
/Views/Movies/Index.cshtml
Upravte soubor a přidejte Rating
pole:
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Rating)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Movies)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.DisplayFor(modelItem => item.Rating)
</td>
<td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
Aktualizujte /Views/Movies/Create.cshtml
pole.Rating
Předchozí skupinu formulářů můžete zkopírovat nebo vložit a nechat intelliSense, aby vám pomohla aktualizovat pole. IntelliSense funguje s pomocnými rutinami značek.
Aktualizujte zbývající šablony.
Aktualizujte SeedData
třídu tak, aby poskytovala hodnotu pro nový sloupec. Níže je uvedena ukázková změna, ale pro každou z nich new Movie
budete chtít provést tuto změnu .
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
Aplikace nebude fungovat, dokud se databáze neaktualizuje tak, aby zahrnovala nové pole. Pokud je teď spuštěný, zobrazí se následující SqlException
:
SqlException: Invalid column name 'Rating'.
K této chybě dochází, protože aktualizovaná třída modelu Movie se liší od schématu tabulky Movie existující 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 na základě nového schématu třídy modelu. Tento přístup je velmi pohodlný v rané fázi vývojového cyklu, když provádíte aktivní vývoj v testovací databázi; umožňuje rychle vyvíjet schéma modelu a databáze společně. Nevýhodou ale je, že ztratíte stávající data v databázi , takže tento přístup nechcete používat v produkční databázi! Použití inicializátoru k automatickému sesílování databáze s testovacími daty je často produktivní způsob vývoje aplikace. Tento přístup je vhodný pro raný vývoj a při použití SQLite.
Explicitně upravte schéma existující databáze tak, aby odpovídalo třídám modelu. Výhodou tohoto přístupu je, že data uchováváte. Tuto změnu můžete provést 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 se používá Migrace Code First.
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
informuje architekturu migrace, aby prozkoumal aktuální Movie
model s aktuálním Movie
schématem databáze a vytvořil potřebný kód pro migraci 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.
Pokud jsou odstraněny všechny záznamy v databázi, inicializace metoda zasadí databázi a zahrne Rating
pole.
Spusťte aplikaci a ověřte, že můžete vytvářet, upravovat a zobrazovat filmy s polem Rating
.
V této části Migrace Code First Entity Framework slouží k:
- Přidejte do modelu nové pole.
- Migrujte nové pole do databáze.
Když se ef Code First použije k automatickému vytvoření databáze, Code First:
- Přidá do databáze tabulku pro sledování schématu databáze.
- Ověřuje, že databáze je synchronizovaná s třídami modelu, ze které byla vygenerována. Pokud nejsou synchronizované, ef vyvolá výjimku. To usnadňuje nalezení nekonzistentních problémů s databází nebo kódem.
Přidání vlastnosti hodnocení do filmového modelu
Rating
Přidat vlastnost doModels/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; }
}
}
Vytvoření aplikace
Ctrl+Shift+B
Protože jste do Movie
třídy přidali nové pole, musíte aktualizovat seznam vazeb vlastností, aby tato nová vlastnost byla zahrnuta. V MoviesController.cs
, aktualizovat [Bind]
atribut pro obě Create
metody Edit
akce zahrnout Rating
vlastnost:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Aktualizujte šablony zobrazení, aby se zobrazila, vytvořila a upravila nová Rating
vlastnost v zobrazení prohlížeče.
/Views/Movies/Index.cshtml
Upravte soubor a přidejte Rating
pole:
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Rating)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Movies)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.DisplayFor(modelItem => item.Rating)
</td>
<td>
Aktualizujte /Views/Movies/Create.cshtml
pole.Rating
Předchozí skupinu formulářů můžete zkopírovat nebo vložit a nechat intelliSense, aby vám pomohla aktualizovat pole. IntelliSense funguje s pomocnými rutinami značek.
Aktualizujte zbývající šablony.
Aktualizujte SeedData
třídu tak, aby poskytovala hodnotu pro nový sloupec. Níže je uvedena ukázková změna, ale pro každou z nich new Movie
budete chtít provést tuto změnu .
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
Aplikace nebude fungovat, dokud se databáze neaktualizuje tak, aby zahrnovala nové pole. Pokud je teď spuštěný, zobrazí se následující SqlException
:
SqlException: Invalid column name 'Rating'.
K této chybě dochází, protože aktualizovaná třída modelu Movie se liší od schématu tabulky Movie existující 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 na základě nového schématu třídy modelu. Tento přístup je velmi pohodlný v rané fázi vývojového cyklu, když provádíte aktivní vývoj v testovací databázi; umožňuje rychle vyvíjet schéma modelu a databáze společně. Nevýhodou ale je, že ztratíte stávající data v databázi , takže tento přístup nechcete používat v produkční databázi! Použití inicializátoru k automatickému sesílování databáze s testovacími daty je často produktivní způsob vývoje aplikace. Tento přístup je vhodný pro raný vývoj a při použití SQLite.
Explicitně upravte schéma existující databáze tak, aby odpovídalo třídám modelu. Výhodou tohoto přístupu je, že data uchováváte. Tuto změnu můžete provést 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 se používá Migrace Code First.
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
informuje architekturu migrace, aby prozkoumal aktuální Movie
model s aktuálním Movie
schématem databáze a vytvořil potřebný kód pro migraci 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.
Pokud jsou odstraněny všechny záznamy v databázi, inicializace metoda zasadí databázi a zahrne Rating
pole.
Spusťte aplikaci a ověřte, že můžete vytvářet, upravovat a zobrazovat filmy s polem Rating
.
V této části Migrace Code First Entity Framework slouží k:
- Přidejte do modelu nové pole.
- Migrujte nové pole do databáze.
Když se ef Code First použije k automatickému vytvoření databáze, Code First:
- Přidá do databáze tabulku pro sledování schématu databáze.
- Ověřuje, že databáze je synchronizovaná s třídami modelu, ze které byla vygenerována. Pokud nejsou synchronizované, ef vyvolá výjimku. To usnadňuje nalezení nekonzistentních problémů s databází nebo kódem.
Přidání vlastnosti hodnocení do filmového modelu
Rating
Přidat vlastnost doModels/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; }
}
}
Vytvoření aplikace
Ctrl+Shift+B
Protože jste do Movie
třídy přidali nové pole, musíte aktualizovat seznam vazeb vlastností, aby tato nová vlastnost byla zahrnuta. V MoviesController.cs
, aktualizovat [Bind]
atribut pro obě Create
metody Edit
akce zahrnout Rating
vlastnost:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Aktualizujte šablony zobrazení, aby se zobrazila, vytvořila a upravila nová Rating
vlastnost v zobrazení prohlížeče.
/Views/Movies/Index.cshtml
Upravte soubor a přidejte Rating
pole:
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Rating)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Movies)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.DisplayFor(modelItem => item.Rating)
</td>
<td>
Aktualizujte /Views/Movies/Create.cshtml
pole.Rating
Předchozí skupinu formulářů můžete zkopírovat nebo vložit a nechat intelliSense, aby vám pomohla aktualizovat pole. IntelliSense funguje s pomocnými rutinami značek.
Aktualizujte zbývající šablony.
Aktualizujte SeedData
třídu tak, aby poskytovala hodnotu pro nový sloupec. Níže je uvedena ukázková změna, ale pro každou z nich new Movie
budete chtít provést tuto změnu .
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
Aplikace nebude fungovat, dokud se databáze neaktualizuje tak, aby zahrnovala nové pole. Pokud je teď spuštěný, zobrazí se následující SqlException
:
SqlException: Invalid column name 'Rating'.
K této chybě dochází, protože aktualizovaná třída modelu Movie se liší od schématu tabulky Movie existující 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 na základě nového schématu třídy modelu. Tento přístup je velmi pohodlný v rané fázi vývojového cyklu, když provádíte aktivní vývoj v testovací databázi; umožňuje rychle vyvíjet schéma modelu a databáze společně. Nevýhodou ale je, že ztratíte stávající data v databázi , takže tento přístup nechcete používat v produkční databázi! Použití inicializátoru k automatickému sesílování databáze s testovacími daty je často produktivní způsob vývoje aplikace. Tento přístup je vhodný pro raný vývoj a při použití SQLite.
Explicitně upravte schéma existující databáze tak, aby odpovídalo třídám modelu. Výhodou tohoto přístupu je, že data uchováváte. Tuto změnu můžete provést 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 se používá Migrace Code First.
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
informuje architekturu migrace, aby prozkoumal aktuální Movie
model s aktuálním Movie
schématem databáze a vytvořil potřebný kód pro migraci 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.
Pokud jsou odstraněny všechny záznamy v databázi, inicializace metoda zasadí databázi a zahrne Rating
pole.
Spusťte aplikaci a ověřte, že můžete vytvářet, upravovat a zobrazovat filmy s polem Rating
.