Sdílet prostřednictvím


Čá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 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 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.

Vývojář zadal písmeno R pro hodnotu atributu asp-for ve druhém prvku popisku zobrazení. Zobrazila se kontextová nabídka IntelliSense zobrazující dostupná pole včetně hodnocení, která jsou v seznamu automaticky zvýrazněná. Když vývojář klikne na pole nebo stiskne klávesu Enter na klávesnici, hodnota se nastaví na Hodnocení.

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 Moviebudete 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ů:

  1. 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.

  2. 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.

  3. 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ů.

Nabídka PMC

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.

Vývojář zadal písmeno R pro hodnotu atributu asp-for ve druhém prvku popisku zobrazení. Zobrazila se kontextová nabídka IntelliSense zobrazující dostupná pole včetně hodnocení, která jsou v seznamu automaticky zvýrazněná. Když vývojář klikne na pole nebo stiskne klávesu Enter na klávesnici, hodnota se nastaví na Hodnocení.

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 Moviebudete 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ů:

  1. 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.

  2. 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.

  3. 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ů.

Nabídka PMC

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.

Vývojář zadal písmeno R pro hodnotu atributu asp-for ve druhém prvku popisku zobrazení. Zobrazila se kontextová nabídka IntelliSense zobrazující dostupná pole včetně hodnocení, která jsou v seznamu automaticky zvýrazněná. Když vývojář klikne na pole nebo stiskne klávesu Enter na klávesnici, hodnota se nastaví na Hodnocení.

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 Moviebudete 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ů:

  1. 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.

  2. 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.

  3. 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ů.

Nabídka PMC

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.

Vývojář zadal písmeno R pro hodnotu atributu asp-for ve druhém prvku popisku zobrazení. Zobrazila se kontextová nabídka IntelliSense zobrazující dostupná pole včetně hodnocení, která jsou v seznamu automaticky zvýrazněná. Když vývojář klikne na pole nebo stiskne klávesu Enter na klávesnici, hodnota se nastaví na Hodnocení.

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 Moviebudete 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ů:

  1. 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.

  2. 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.

  3. 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ů.

Nabídka PMC

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.

Vývojář zadal písmeno R pro hodnotu atributu asp-for ve druhém prvku popisku zobrazení. Zobrazila se kontextová nabídka IntelliSense zobrazující dostupná pole včetně hodnocení, která jsou v seznamu automaticky zvýrazněná. Když vývojář klikne na pole nebo stiskne klávesu Enter na klávesnici, hodnota se nastaví na Hodnocení.

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 Moviebudete 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ů:

  1. 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.

  2. 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.

  3. 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ů.

Nabídka PMC

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.

Vývojář zadal písmeno R pro hodnotu atributu asp-for ve druhém prvku popisku zobrazení. Zobrazila se kontextová nabídka IntelliSense zobrazující dostupná pole včetně hodnocení, která jsou v seznamu automaticky zvýrazněná. Když vývojář klikne na pole nebo stiskne klávesu Enter na klávesnici, hodnota se nastaví na Hodnocení.

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 Moviebudete 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ů:

  1. 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.

  2. 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.

  3. 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ů.

Nabídka PMC

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 .