Megosztás a következőn keresztül:


8. rész, új mező hozzáadása egy ASP.NET Core MVC-alkalmazáshoz

Megjegyzés:

Ez nem a cikk legújabb verziója. Az aktuális kiadásról a cikk .NET 10-es verziójában olvashat.

Figyelmeztetés

A ASP.NET Core ezen verziója már nem támogatott. További információt a .NET és a .NET Core támogatási szabályzatában talál. A jelen cikk .NET 9-es verzióját lásd az aktuális kiadásért .

Készítette: Rick Anderson

Ebben a szakaszban az entity framework migrations a következőre szolgál:

  • Adjon hozzá egy új mezőt a modellhez.
  • Az új mező áttelepítése az adatbázisba.

Ha az Entity Framework (EF) használatával automatikusan létrehoz egy adatbázist modellosztályokból:

  • A rendszer hozzáad egy táblát az adatbázishoz az adatbázis sémájának nyomon követéséhez.
  • A rendszer ellenőrzi, hogy az adatbázis szinkronban van-e a létrehozott modellosztályokkal. Ha nincsenek szinkronban, az EF kivételt jelez. Így könnyebben megtalálhatja az adatbázissal/kóddal kapcsolatos inkonzisztens problémákat.

Minősítési tulajdonság hozzáadása a filmmodellhez

Adj egy Rating tulajdonságot a Models/Movie.cs-hez.

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; }
}

Az alkalmazás létrehozása

Nyomja le Ctrl+Shift+B

Mivel új mezőt adott hozzá az Movie osztályhoz, frissítenie kell a tulajdonságkötési listát, hogy ez az új tulajdonság szerepeljen benne. MoviesController.cs frissítse az [Bind] attribútumot mind a Create és Edit műveleti metódusok esetében a Rating tulajdonság hozzáadásával.

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Frissítse a nézetsablonokat az új Rating tulajdonság böngészőnézetben való megjelenítéséhez, létrehozásához és szerkesztéséhez.

Szerkessze a /Views/Movies/Index.cshtml fájlt, és adjon hozzá egy Rating mezőt:

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

Frissítse a /Views/Movies/Create.cshtml mezőt egy Rating mezővel.

Másolhatja/beillesztheti az előző "űrlapcsoportot", és az intelliSense segítségével frissítheti a mezőket. Az IntelliSense használható Címkesegédekkel.

A fejlesztő beírta az R betűt az asp-for attribútumértékéhez a nézet második címkeelemében. Megjelent egy Intellisense helyi menü, amely az elérhető mezőket jeleníti meg, beleértve a Minősítést is, amely automatikusan ki van emelve a listában. Amikor a fejlesztő rákattint a mezőre, vagy lenyomja az Enter billentyűt, az érték a Minősítés értékre lesz állítva.

Adja hozzá a Rating tulajdonságot a maradék Create.cshtml, Delete.cshtml, Details.cshtml és Edit.cshtml nézet sablonokhoz.

Frissítse a SeedData osztályt, hogy értéket adjon az új oszlopnak. Az alábbiakban látható egy mintamódosítás, de minden new Movie esetében érdemes ezt a módosítást elvégezni.

new Movie
{
    Title = "When Harry Met Sally",
    ReleaseDate = DateTime.Parse("1989-1-11"),
    Genre = "Romantic Comedy",
    Rating = "R",
    Price = 7.99M
},

Az alkalmazás csak akkor működik, ha az adatbázis frissül, hogy az új mezőt is tartalmazza. Ha most fut, a következő SqlException lesz:

SqlException: Invalid column name 'Rating'.

Ez a hiba azért fordul elő, mert a frissített filmmodell-osztály eltér a meglévő adatbázis Movie táblájának sémáitól. (Az adatbázistábla nem Rating tartalmaz oszlopot.)

A hiba megoldásának néhány módszere van:

  1. Az Entity Framework automatikusan elveti és újra létrehozza az adatbázist az új modell osztály séma szerint. Ez a megközelítés nagyon kényelmes a fejlesztési ciklus korai szakaszában, amikor aktív fejlesztést végez egy tesztadatbázison; lehetővé teszi a modell és az adatbázis sémájának gyors együttfejlését. A hátránya azonban az, hogy elveszíti a meglévő adatokat az adatbázisban – ezért nem szeretné ezt a megközelítést éles adatbázisban használni! Az inicializáló használata az adatbázisok automatikus üzembe helyezése tesztadatokkal gyakran hatékony módszer az alkalmazások fejlesztésére. Ez jó módszer a korai fejlesztéshez és az SQLite használatakor.

  2. Explicit módon módosítsa a meglévő adatbázis sémáját úgy, hogy az megfeleljen a modellosztályoknak. Ennek a módszernek az az előnye, hogy megtartja az adatait. Ezt a módosítást manuálisan vagy adatbázis-módosítási szkript létrehozásával végezheti el.

  3. Az adatbázisséma frissítéséhez használja az Entity Framework Migrations szolgáltatást.

Ebben az oktatóanyagban az Entity Framework Migrationst használjuk.

Az Eszközök menüben válassza a NuGet Package Manager > Csomagkezelő konzollehetőséget.

PMC menü

A Package Manager konzolon adja meg a következő parancsot:

Add-Migration Rating

A Add-Migration parancs arra utasítja a migrálási keretrendszert, hogy vizsgálja meg az aktuális Movie modellt az aktuális Movie DB-sémával, és hozza létre a szükséges kódot a db új modellbe való migrálásához.

A "Rating" név tetszőleges, és az áttelepítési fájl elnevezésére szolgál. Hasznos, ha a migrálási fájlnak értelmes nevet ad.

Ha az adatbázis összes rekordja törölve van, az inicializáló metódus beinicializálja az adatbázist, illetve tartalmazza a Rating mezőt.

A Package Manager konzolon adja meg a következő parancsot:

Update-Database

A Update-Database parancs a nem alkalmazott áttelepítéseken futtatja a Fel metódust.

Futtassa az alkalmazást, és ellenőrizze, hogy Rating mezővel hozhat létre, szerkeszthet és jeleníthet meg filmeket.

Ebben a szakaszban a Entity Framework Code First Migrations használatos a következő célokra:

  • Adjon hozzá egy új mezőt a modellhez.
  • Az új mező áttelepítése az adatbázisba.

Amikor az EF Code First használatával automatikusan létrehoz egy adatbázist, a Code First:

  • Hozzáad egy táblát az adatbázishoz az adatbázis sémájának nyomon követéséhez.
  • Ellenőrzi, hogy az adatbázis szinkronban van-e a létrehozott modellosztályokkal. Ha nincsenek szinkronban, az EF kivételt jelez. Így könnyebben megtalálhatja az adatbázissal/kóddal kapcsolatos inkonzisztens problémákat.

Minősítési tulajdonság hozzáadása a filmmodellhez

Adj egy Rating tulajdonságot a Models/Movie.cs-hez.

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; }
}

Az alkalmazás létrehozása

Nyomja le Ctrl+Shift+B

Mivel új mezőt adott hozzá az Movie osztályhoz, frissítenie kell a tulajdonságkötési listát, hogy ez az új tulajdonság szerepeljen benne. MoviesController.cs frissítse az [Bind] attribútumot mind a Create és Edit műveleti metódusok esetében a Rating tulajdonság hozzáadásával.

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Frissítse a nézetsablonokat az új Rating tulajdonság böngészőnézetben való megjelenítéséhez, létrehozásához és szerkesztéséhez.

Szerkessze a /Views/Movies/Index.cshtml fájlt, és adjon hozzá egy Rating mezőt:

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

Frissítse a /Views/Movies/Create.cshtml mezőt egy Rating mezővel.

Másolhatja/beillesztheti az előző "űrlapcsoportot", és az intelliSense segítségével frissítheti a mezőket. Az IntelliSense használható Címkesegédekkel.

A fejlesztő beírta az R betűt az asp-for attribútumértékéhez a nézet második címkeelemében. Megjelent egy Intellisense helyi menü, amely az elérhető mezőket jeleníti meg, beleértve a Minősítést is, amely automatikusan ki van emelve a listában. Amikor a fejlesztő rákattint a mezőre, vagy lenyomja az Enter billentyűt, az érték a Minősítés értékre lesz állítva.

Frissítse a fennmaradó sablonokat.

Frissítse a SeedData osztályt, hogy értéket adjon az új oszlopnak. Az alábbiakban látható egy mintamódosítás, de minden new Movie esetében érdemes ezt a módosítást elvégezni.

new Movie
{
    Title = "When Harry Met Sally",
    ReleaseDate = DateTime.Parse("1989-1-11"),
    Genre = "Romantic Comedy",
    Rating = "R",
    Price = 7.99M
},

Az alkalmazás csak akkor működik, ha az adatbázis frissül, hogy az új mezőt is tartalmazza. Ha most fut, a következő SqlException lesz:

SqlException: Invalid column name 'Rating'.

Ez a hiba azért fordul elő, mert a frissített filmmodell-osztály eltér a meglévő adatbázis Movie táblájának sémáitól. (Az adatbázistábla nem Rating tartalmaz oszlopot.)

A hiba megoldásának néhány módszere van:

  1. Az Entity Framework automatikusan elveti és újra létrehozza az adatbázist az új modell osztály séma szerint. Ez a megközelítés nagyon kényelmes a fejlesztési ciklus korai szakaszában, amikor aktív fejlesztést végez egy tesztadatbázison; lehetővé teszi a modell és az adatbázis sémájának gyors együttfejlését. A hátránya azonban az, hogy elveszíti a meglévő adatokat az adatbázisban – ezért nem szeretné ezt a megközelítést éles adatbázisban használni! Az inicializáló használata az adatbázisok automatikus üzembe helyezése tesztadatokkal gyakran hatékony módszer az alkalmazások fejlesztésére. Ez jó módszer a korai fejlesztéshez és az SQLite használatakor.

  2. Explicit módon módosítsa a meglévő adatbázis sémáját úgy, hogy az megfeleljen a modellosztályoknak. Ennek a módszernek az az előnye, hogy megtartja az adatait. Ezt a módosítást manuálisan vagy adatbázis-módosítási szkript létrehozásával végezheti el.

  3. Az adatbázisséma frissítéséhez használja a Code First Migrations szolgáltatást.

Ebben az oktatóanyagban a Code First Migrationst használja a rendszer.

Az Eszközök menüben válassza a NuGet Package Manager > Csomagkezelő konzollehetőséget.

PMC menü

A PMC-ben adja meg a következő parancsokat:

Add-Migration Rating
Update-Database

A Add-Migration parancs arra utasítja a migrálási keretrendszert, hogy vizsgálja meg az aktuális Movie modellt az aktuális Movie DB-sémával, és hozza létre a szükséges kódot a db új modellbe való migrálásához.

A "Rating" név tetszőleges, és az áttelepítési fájl elnevezésére szolgál. Hasznos, ha a migrálási fájlnak értelmes nevet ad.

Ha az adatbázis összes rekordja törölve van, az inicializáló metódus beinicializálja az adatbázist, illetve tartalmazza a Rating mezőt.

Futtassa az alkalmazást, és ellenőrizze, hogy Rating mezővel hozhat létre, szerkeszthet és jeleníthet meg filmeket.

Ebben a szakaszban a Entity Framework Code First Migrations használatos a következő célokra:

  • Adjon hozzá egy új mezőt a modellhez.
  • Az új mező áttelepítése az adatbázisba.

Amikor az EF Code First használatával automatikusan létrehoz egy adatbázist, a Code First:

  • Hozzáad egy táblát az adatbázishoz az adatbázis sémájának nyomon követéséhez.
  • Ellenőrzi, hogy az adatbázis szinkronban van-e a létrehozott modellosztályokkal. Ha nincsenek szinkronban, az EF kivételt jelez. Így könnyebben megtalálhatja az adatbázissal/kóddal kapcsolatos inkonzisztens problémákat.

Minősítési tulajdonság hozzáadása a filmmodellhez

Adj egy Rating tulajdonságot a Models/Movie.cs-hez.

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; }
}

Az alkalmazás létrehozása

Nyomja le Ctrl+Shift+B

Mivel új mezőt adott hozzá az Movie osztályhoz, frissítenie kell a tulajdonságkötési listát, hogy ez az új tulajdonság szerepeljen benne. MoviesController.cs frissítse az [Bind] attribútumot mind a Create és Edit műveleti metódusok esetében a Rating tulajdonság hozzáadásával.

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Frissítse a nézetsablonokat az új Rating tulajdonság böngészőnézetben való megjelenítéséhez, létrehozásához és szerkesztéséhez.

Szerkessze a /Views/Movies/Index.cshtml fájlt, és adjon hozzá egy Rating mezőt:

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

Frissítse a /Views/Movies/Create.cshtml mezőt egy Rating mezővel.

Másolhatja/beillesztheti az előző "űrlapcsoportot", és az intelliSense segítségével frissítheti a mezőket. Az IntelliSense használható Címkesegédekkel.

A fejlesztő beírta az R betűt az asp-for attribútumértékéhez a nézet második címkeelemében. Megjelent egy Intellisense helyi menü, amely az elérhető mezőket jeleníti meg, beleértve a Minősítést is, amely automatikusan ki van emelve a listában. Amikor a fejlesztő rákattint a mezőre, vagy lenyomja az Enter billentyűt, az érték a Minősítés értékre lesz állítva.

Frissítse a fennmaradó sablonokat.

Frissítse a SeedData osztályt, hogy értéket adjon az új oszlopnak. Az alábbiakban látható egy mintamódosítás, de minden new Movie esetében érdemes ezt a módosítást elvégezni.

new Movie
{
    Title = "When Harry Met Sally",
    ReleaseDate = DateTime.Parse("1989-1-11"),
    Genre = "Romantic Comedy",
    Rating = "R",
    Price = 7.99M
},

Az alkalmazás csak akkor működik, ha az adatbázis frissül, hogy az új mezőt is tartalmazza. Ha most fut, a következő SqlException lesz:

SqlException: Invalid column name 'Rating'.

Ez a hiba azért fordul elő, mert a frissített filmmodell-osztály eltér a meglévő adatbázis Movie táblájának sémáitól. (Az adatbázistábla nem Rating tartalmaz oszlopot.)

A hiba megoldásának néhány módszere van:

  1. Az Entity Framework automatikusan elveti és újra létrehozza az adatbázist az új modell osztály séma szerint. Ez a megközelítés nagyon kényelmes a fejlesztési ciklus korai szakaszában, amikor aktív fejlesztést végez egy tesztadatbázison; lehetővé teszi a modell és az adatbázis sémájának gyors együttfejlését. A hátránya azonban az, hogy elveszíti a meglévő adatokat az adatbázisban – ezért nem szeretné ezt a megközelítést éles adatbázisban használni! Az inicializáló használata az adatbázisok automatikus üzembe helyezése tesztadatokkal gyakran hatékony módszer az alkalmazások fejlesztésére. Ez jó módszer a korai fejlesztéshez és az SQLite használatakor.

  2. Explicit módon módosítsa a meglévő adatbázis sémáját úgy, hogy az megfeleljen a modellosztályoknak. Ennek a módszernek az az előnye, hogy megtartja az adatait. Ezt a módosítást manuálisan vagy adatbázis-módosítási szkript létrehozásával végezheti el.

  3. Az adatbázisséma frissítéséhez használja a Code First Migrations szolgáltatást.

Ebben az oktatóanyagban a Code First Migrationst használja a rendszer.

Az Eszközök menüben válassza a NuGet Package Manager > Csomagkezelő konzollehetőséget.

PMC menü

A PMC-ben adja meg a következő parancsokat:

Add-Migration Rating
Update-Database

A Add-Migration parancs arra utasítja a migrálási keretrendszert, hogy vizsgálja meg az aktuális Movie modellt az aktuális Movie DB-sémával, és hozza létre a szükséges kódot a db új modellbe való migrálásához.

A "Rating" név tetszőleges, és az áttelepítési fájl elnevezésére szolgál. Hasznos, ha a migrálási fájlnak értelmes nevet ad.

Ha az adatbázis összes rekordja törölve van, az inicializáló metódus beinicializálja az adatbázist, illetve tartalmazza a Rating mezőt.

Futtassa az alkalmazást, és ellenőrizze, hogy Rating mezővel hozhat létre, szerkeszthet és jeleníthet meg filmeket.

Ebben a szakaszban a Entity Framework Code First Migrations használatos a következő célokra:

  • Adjon hozzá egy új mezőt a modellhez.
  • Az új mező áttelepítése az adatbázisba.

Amikor az EF Code First használatával automatikusan létrehoz egy adatbázist, a Code First:

  • Hozzáad egy táblát az adatbázishoz az adatbázis sémájának nyomon követéséhez.
  • Ellenőrzi, hogy az adatbázis szinkronban van-e a létrehozott modellosztályokkal. Ha nincsenek szinkronban, az EF kivételt jelez. Így könnyebben megtalálhatja az adatbázissal/kóddal kapcsolatos inkonzisztens problémákat.

Minősítési tulajdonság hozzáadása a filmmodellhez

Adj egy Rating tulajdonságot a Models/Movie.cs-hez.

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; }
    }
}

Az alkalmazás létrehozása

Ctrl+Shift+B

Mivel új mezőt adott hozzá az Movie osztályhoz, frissítenie kell a tulajdonságkötési listát, hogy ez az új tulajdonság szerepeljen benne. MoviesController.cs frissítse az [Bind] attribútumot mind a Create és Edit műveleti metódusok esetében a Rating tulajdonság hozzáadásával.

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Frissítse a nézetsablonokat az új Rating tulajdonság böngészőnézetben való megjelenítéséhez, létrehozásához és szerkesztéséhez.

Szerkessze a /Views/Movies/Index.cshtml fájlt, és adjon hozzá egy Rating mezőt:

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

Frissítse a /Views/Movies/Create.cshtml mezőt egy Rating mezővel.

Másolhatja/beillesztheti az előző "űrlapcsoportot", és az intelliSense segítségével frissítheti a mezőket. Az IntelliSense használható Címkesegédekkel.

A fejlesztő beírta az R betűt az asp-for attribútumértékéhez a nézet második címkeelemében. Megjelent egy Intellisense helyi menü, amely az elérhető mezőket jeleníti meg, beleértve a Minősítést is, amely automatikusan ki van emelve a listában. Amikor a fejlesztő rákattint a mezőre, vagy lenyomja az Enter billentyűt, az érték a Minősítés értékre lesz állítva.

Frissítse a fennmaradó sablonokat.

Frissítse a SeedData osztályt, hogy értéket adjon az új oszlopnak. Az alábbiakban látható egy mintamódosítás, de minden new Movie esetében érdemes ezt a módosítást elvégezni.

new Movie
{
    Title = "When Harry Met Sally",
    ReleaseDate = DateTime.Parse("1989-1-11"),
    Genre = "Romantic Comedy",
    Rating = "R",
    Price = 7.99M
},

Az alkalmazás csak akkor működik, ha az adatbázis frissül, hogy az új mezőt is tartalmazza. Ha most fut, a következő SqlException lesz:

SqlException: Invalid column name 'Rating'.

Ez a hiba azért fordul elő, mert a frissített filmmodell-osztály eltér a meglévő adatbázis Movie táblájának sémáitól. (Az adatbázistábla nem Rating tartalmaz oszlopot.)

A hiba megoldásának néhány módszere van:

  1. Az Entity Framework automatikusan elveti és újra létrehozza az adatbázist az új modell osztály séma szerint. Ez a megközelítés nagyon kényelmes a fejlesztési ciklus korai szakaszában, amikor aktív fejlesztést végez egy tesztadatbázison; lehetővé teszi a modell és az adatbázis sémájának gyors együttfejlését. A hátránya azonban az, hogy elveszíti a meglévő adatokat az adatbázisban – ezért nem szeretné ezt a megközelítést éles adatbázisban használni! Az inicializáló használata az adatbázisok automatikus üzembe helyezése tesztadatokkal gyakran hatékony módszer az alkalmazások fejlesztésére. Ez jó módszer a korai fejlesztéshez és az SQLite használatakor.

  2. Explicit módon módosítsa a meglévő adatbázis sémáját úgy, hogy az megfeleljen a modellosztályoknak. Ennek a módszernek az az előnye, hogy megtartja az adatait. Ezt a módosítást manuálisan vagy adatbázis-módosítási szkript létrehozásával végezheti el.

  3. Az adatbázisséma frissítéséhez használja a Code First Migrations szolgáltatást.

Ebben az oktatóanyagban a Code First Migrationst használja a rendszer.

Az Eszközök menüben válassza a NuGet Package Manager > Csomagkezelő konzollehetőséget.

PMC menü

A PMC-ben adja meg a következő parancsokat:

Add-Migration Rating
Update-Database

A Add-Migration parancs arra utasítja a migrálási keretrendszert, hogy vizsgálja meg az aktuális Movie modellt az aktuális Movie DB-sémával, és hozza létre a szükséges kódot a db új modellbe való migrálásához.

A "Rating" név tetszőleges, és az áttelepítési fájl elnevezésére szolgál. Hasznos, ha a migrálási fájlnak értelmes nevet ad.

Ha az adatbázis összes rekordja törölve van, az inicializáló metódus beinicializálja az adatbázist, illetve tartalmazza a Rating mezőt.

Futtassa az alkalmazást, és ellenőrizze, hogy Rating mezővel hozhat létre, szerkeszthet és jeleníthet meg filmeket.

Ebben a szakaszban a Entity Framework Code First Migrations használatos a következő célokra:

  • Adjon hozzá egy új mezőt a modellhez.
  • Az új mező áttelepítése az adatbázisba.

Amikor az EF Code First használatával automatikusan létrehoz egy adatbázist, a Code First:

  • Hozzáad egy táblát az adatbázishoz az adatbázis sémájának nyomon követéséhez.
  • Ellenőrzi, hogy az adatbázis szinkronban van-e a létrehozott modellosztályokkal. Ha nincsenek szinkronban, az EF kivételt jelez. Így könnyebben megtalálhatja az adatbázissal/kóddal kapcsolatos inkonzisztens problémákat.

Minősítési tulajdonság hozzáadása a filmmodellhez

Adj egy Rating tulajdonságot a Models/Movie.cs-hez.

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; }
    }
}

Az alkalmazás létrehozása

Ctrl+Shift+B

Mivel új mezőt adott hozzá az Movie osztályhoz, frissítenie kell a tulajdonságkötési listát, hogy ez az új tulajdonság szerepeljen benne. MoviesController.cs frissítse az [Bind] attribútumot mind a Create és Edit műveleti metódusok esetében a Rating tulajdonság hozzáadásával.

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Frissítse a nézetsablonokat az új Rating tulajdonság böngészőnézetben való megjelenítéséhez, létrehozásához és szerkesztéséhez.

Szerkessze a /Views/Movies/Index.cshtml fájlt, és adjon hozzá egy Rating mezőt:

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

Frissítse a /Views/Movies/Create.cshtml mezőt egy Rating mezővel.

Másolhatja/beillesztheti az előző "űrlapcsoportot", és az intelliSense segítségével frissítheti a mezőket. Az IntelliSense használható Címkesegédekkel.

A fejlesztő beírta az R betűt az asp-for attribútumértékéhez a nézet második címkeelemében. Megjelent egy Intellisense helyi menü, amely az elérhető mezőket jeleníti meg, beleértve a Minősítést is, amely automatikusan ki van emelve a listában. Amikor a fejlesztő rákattint a mezőre, vagy lenyomja az Enter billentyűt, az érték a Minősítés értékre lesz állítva.

Frissítse a fennmaradó sablonokat.

Frissítse a SeedData osztályt, hogy értéket adjon az új oszlopnak. Az alábbiakban látható egy mintamódosítás, de minden new Movie esetében érdemes ezt a módosítást elvégezni.

new Movie
{
    Title = "When Harry Met Sally",
    ReleaseDate = DateTime.Parse("1989-1-11"),
    Genre = "Romantic Comedy",
    Rating = "R",
    Price = 7.99M
},

Az alkalmazás csak akkor működik, ha az adatbázis frissül, hogy az új mezőt is tartalmazza. Ha most fut, a következő SqlException lesz:

SqlException: Invalid column name 'Rating'.

Ez a hiba azért fordul elő, mert a frissített filmmodell-osztály eltér a meglévő adatbázis Movie táblájának sémáitól. (Az adatbázistábla nem Rating tartalmaz oszlopot.)

A hiba megoldásának néhány módszere van:

  1. Az Entity Framework automatikusan elveti és újra létrehozza az adatbázist az új modell osztály séma szerint. Ez a megközelítés nagyon kényelmes a fejlesztési ciklus korai szakaszában, amikor aktív fejlesztést végez egy tesztadatbázison; lehetővé teszi a modell és az adatbázis sémájának gyors együttfejlését. A hátránya azonban az, hogy elveszíti a meglévő adatokat az adatbázisban – ezért nem szeretné ezt a megközelítést éles adatbázisban használni! Az inicializáló használata az adatbázisok automatikus üzembe helyezése tesztadatokkal gyakran hatékony módszer az alkalmazások fejlesztésére. Ez jó módszer a korai fejlesztéshez és az SQLite használatakor.

  2. Explicit módon módosítsa a meglévő adatbázis sémáját úgy, hogy az megfeleljen a modellosztályoknak. Ennek a módszernek az az előnye, hogy megtartja az adatait. Ezt a módosítást manuálisan vagy adatbázis-módosítási szkript létrehozásával végezheti el.

  3. Az adatbázisséma frissítéséhez használja a Code First Migrations szolgáltatást.

Ebben az oktatóanyagban a Code First Migrationst használja a rendszer.

Az Eszközök menüben válassza a NuGet Package Manager > Csomagkezelő konzollehetőséget.

PMC menü

A PMC-ben adja meg a következő parancsokat:

Add-Migration Rating
Update-Database

A Add-Migration parancs arra utasítja a migrálási keretrendszert, hogy vizsgálja meg az aktuális Movie modellt az aktuális Movie DB-sémával, és hozza létre a szükséges kódot a db új modellbe való migrálásához.

A "Rating" név tetszőleges, és az áttelepítési fájl elnevezésére szolgál. Hasznos, ha a migrálási fájlnak értelmes nevet ad.

Ha az adatbázis összes rekordja törölve van, az inicializáló metódus beinicializálja az adatbázist, illetve tartalmazza a Rating mezőt.

Futtassa az alkalmazást, és ellenőrizze, hogy Rating mezővel hozhat létre, szerkeszthet és jeleníthet meg filmeket.

Ebben a szakaszban a Entity Framework Code First Migrations használatos a következő célokra:

  • Adjon hozzá egy új mezőt a modellhez.
  • Az új mező áttelepítése az adatbázisba.

Amikor az EF Code First használatával automatikusan létrehoz egy adatbázist, a Code First:

  • Hozzáad egy táblát az adatbázishoz az adatbázis sémájának nyomon követéséhez.
  • Ellenőrzi, hogy az adatbázis szinkronban van-e a létrehozott modellosztályokkal. Ha nincsenek szinkronban, az EF kivételt jelez. Így könnyebben megtalálhatja az adatbázissal/kóddal kapcsolatos inkonzisztens problémákat.

Minősítési tulajdonság hozzáadása a filmmodellhez

Adj egy Rating tulajdonságot a Models/Movie.cs-hez.

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; }
    }
}

Az alkalmazás létrehozása

Ctrl+Shift+B

Mivel új mezőt adott hozzá az Movie osztályhoz, frissítenie kell a tulajdonságkötési listát, hogy ez az új tulajdonság szerepeljen benne. MoviesController.cs frissítse az [Bind] attribútumot mind a Create és Edit műveleti metódusok esetében a Rating tulajdonság hozzáadásával.

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Frissítse a nézetsablonokat az új Rating tulajdonság böngészőnézetben való megjelenítéséhez, létrehozásához és szerkesztéséhez.

Szerkessze a /Views/Movies/Index.cshtml fájlt, és adjon hozzá egy Rating mezőt:

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

Frissítse a /Views/Movies/Create.cshtml mezőt egy Rating mezővel.

Másolhatja/beillesztheti az előző "űrlapcsoportot", és az intelliSense segítségével frissítheti a mezőket. Az IntelliSense használható Címkesegédekkel.

A fejlesztő beírta az R betűt az asp-for attribútumértékéhez a nézet második címkeelemében. Megjelent egy Intellisense helyi menü, amely az elérhető mezőket jeleníti meg, beleértve a Minősítést is, amely automatikusan ki van emelve a listában. Amikor a fejlesztő rákattint a mezőre, vagy lenyomja az Enter billentyűt, az érték a Minősítés értékre lesz állítva.

Frissítse a fennmaradó sablonokat.

Frissítse a SeedData osztályt, hogy értéket adjon az új oszlopnak. Az alábbiakban látható egy mintamódosítás, de minden new Movie esetében érdemes ezt a módosítást elvégezni.

new Movie
{
    Title = "When Harry Met Sally",
    ReleaseDate = DateTime.Parse("1989-1-11"),
    Genre = "Romantic Comedy",
    Rating = "R",
    Price = 7.99M
},

Az alkalmazás csak akkor működik, ha az adatbázis frissül, hogy az új mezőt is tartalmazza. Ha most fut, a következő SqlException lesz:

SqlException: Invalid column name 'Rating'.

Ez a hiba azért fordul elő, mert a frissített filmmodell-osztály eltér a meglévő adatbázis Movie táblájának sémáitól. (Az adatbázistábla nem Rating tartalmaz oszlopot.)

A hiba megoldásának néhány módszere van:

  1. Az Entity Framework automatikusan elveti és újra létrehozza az adatbázist az új modell osztály séma szerint. Ez a megközelítés nagyon kényelmes a fejlesztési ciklus korai szakaszában, amikor aktív fejlesztést végez egy tesztadatbázison; lehetővé teszi a modell és az adatbázis sémájának gyors együttfejlését. A hátránya azonban az, hogy elveszíti a meglévő adatokat az adatbázisban – ezért nem szeretné ezt a megközelítést éles adatbázisban használni! Az inicializáló használata az adatbázisok automatikus üzembe helyezése tesztadatokkal gyakran hatékony módszer az alkalmazások fejlesztésére. Ez jó módszer a korai fejlesztéshez és az SQLite használatakor.

  2. Explicit módon módosítsa a meglévő adatbázis sémáját úgy, hogy az megfeleljen a modellosztályoknak. Ennek a módszernek az az előnye, hogy megtartja az adatait. Ezt a módosítást manuálisan vagy adatbázis-módosítási szkript létrehozásával végezheti el.

  3. Az adatbázisséma frissítéséhez használja a Code First Migrations szolgáltatást.

Ebben az oktatóanyagban a Code First Migrationst használja a rendszer.

Az Eszközök menüben válassza a NuGet Package Manager > Csomagkezelő konzollehetőséget.

PMC menü

A PMC-ben adja meg a következő parancsokat:

Add-Migration Rating
Update-Database

A Add-Migration parancs arra utasítja a migrálási keretrendszert, hogy vizsgálja meg az aktuális Movie modellt az aktuális Movie DB-sémával, és hozza létre a szükséges kódot a db új modellbe való migrálásához.

A "Rating" név tetszőleges, és az áttelepítési fájl elnevezésére szolgál. Hasznos, ha a migrálási fájlnak értelmes nevet ad.

Ha az adatbázis összes rekordja törölve van, az inicializáló metódus beinicializálja az adatbázist, illetve tartalmazza a Rating mezőt.

Futtassa az alkalmazást, és ellenőrizze, hogy Rating mezővel hozhat létre, szerkeszthet és jeleníthet meg filmeket.