Sdílet prostřednictvím


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

  1. Models/Movie.cs Otevřete soubor a přidejte Rating 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;
    }
    
  2. Upravit Pages/Movies/Index.cshtmla přidat Rating 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>
    
  3. 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á SqlExceptionná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ů:

  1. 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.
  2. 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.
  3. 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í

  1. V nabídce Nástroje vyberte Správce balíčků konzolu NuGet > Správce balíčků.

  2. 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ématem Movie 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.

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

  1. Vyberte databázi v SSOX.

  2. Klikněte pravým tlačítkem myši na databázi a vyberte Odstranit.

  3. Zaškrtněte políčko Zavřít existující připojení.

  4. Vyberte OK.

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

  1. Models/Movie.cs Otevřete soubor a přidejte Rating 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;
    }
    
  2. Upravit Pages/Movies/Index.cshtmla přidat Rating 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>
    
  3. 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á SqlExceptionná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ů:

  1. 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.
  2. 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.
  3. 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í

  1. V nabídce Nástroje vyberte Správce balíčků konzolu NuGet > Správce balíčků.

  2. 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ématem Movie 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:

  1. Vyberte databázi v SSOX.

  2. Klikněte pravým tlačítkem myši na databázi a vyberte Odstranit.

  3. Zaškrtněte políčko Zavřít existující připojení.

  4. Vyberte OK.

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

  1. Models/Movie.cs Otevřete soubor a přidejte Rating 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;
    }
    
  2. Upravit Pages/Movies/Index.cshtmla přidat Rating 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>
    
  3. 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á SqlExceptionná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ů:

  1. 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.
  2. 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.
  3. 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í

  1. V nabídce Nástroje vyberte Správce balíčků konzolu NuGet > Správce balíčků.

  2. 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ématem Movie 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:

  1. Vyberte databázi v SSOX.

  2. Klikněte pravým tlačítkem myši na databázi a vyberte Odstranit.

  3. Zaškrtněte políčko Zavřít existující připojení.

  4. Vyberte OK.

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

  1. Models/Movie.cs Otevřete soubor a přidejte Rating 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;
    }
    
  2. Upravit Pages/Movies/Index.cshtmla přidat Rating 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>
    
  3. 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á SqlExceptionná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ů:

  1. 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.
  2. 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.
  3. 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í

  1. V nabídce Nástroje vyberte Správce balíčků konzolu NuGet > Správce balíčků.

  2. 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ématem Movie 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:

  1. Vyberte databázi v SSOX.

  2. Klikněte pravým tlačítkem myši na databázi a vyberte Odstranit.

  3. Zaškrtněte políčko Zavřít existující připojení.

  4. Vyberte OK.

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

  1. Models/Movie.cs Otevřete soubor a přidejte Rating 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; }
    }
    
  2. Sestavení aplikace

  3. Upravit Pages/Movies/Index.cshtmla přidat Rating 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>
    
  4. 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á SqlExceptionná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ů:

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

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

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

  1. V nabídce Nástroje vyberte Správce balíčků konzolu NuGet > Správce balíčků.

  2. 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ématem Movie 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:

  1. Vyberte databázi v SSOX.

  2. Klikněte pravým tlačítkem myši na databázi a vyberte Odstranit.

  3. Zaškrtněte políčko Zavřít existující připojení.

  4. Vyberte OK.

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

  1. Models/Movie.cs Otevřete soubor a přidejte Rating 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; }
    }
    
  2. Sestavení aplikace

  3. Upravit Pages/Movies/Index.cshtmla přidat Rating 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>
    
  4. 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á SqlExceptionná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ů:

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

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

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

  1. V nabídce Nástroje vyberte Správce balíčků konzolu NuGet > Správce balíčků.

  2. 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ématem Movie 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.

Další kroky