Dela via


Del 8, lägg till ett nytt fält i en ASP.NET Core MVC-app

Anmärkning

Det här är inte den senaste versionen av den här artikeln. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Varning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Viktigt!

Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Av Rick Anderson

I det här avsnittet används Entity Framework Migrations för att:

  • Lägg till ett nytt fält i modellen.
  • Migrera det nya fältet till databasen.

När Entity Framework (EF) används för att automatiskt skapa en databas från modellklasser:

  • En tabell läggs till i databasen för att spåra schemat för databasen.
  • Databasen har verifierats vara synkroniserad med de modellklasser som den genererades från. Om de inte är synkroniserade utlöser EF ett undantag. Detta gör det enklare att hitta inkonsekventa problem med databas/kod.

Lägga till en klassificeringsegenskap i filmmodellen

Lägg till en Rating egenskap i Models/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; }
}

Skapa appen

Tryck på Ctrl+Skift+B

Eftersom du har lagt till ett nytt fält i Movie klassen måste du uppdatera egenskapsbindningslistan så att den nya egenskapen inkluderas. I MoviesController.csuppdaterar du [Bind] attributet för både åtgärdsmetoderna Create och Edit så att egenskapen inkluderas Rating :

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

Uppdatera vymallarna för att visa, skapa och redigera den nya Rating egenskapen i webbläsarvyn.

/Views/Movies/Index.cshtml Redigera filen och lägg till ett Rating fält:

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

Uppdatera /Views/Movies/Create.cshtml med ett Rating fält.

Du kan kopiera/klistra in den tidigare "formulärgruppen" och låta intelliSense hjälpa dig att uppdatera fälten. IntelliSense fungerar med Tag Helpers.

Utvecklaren har skrivit bokstaven R för attributvärdet asp-for i det andra etikettelementet i vyn. En Intellisense-snabbmeny har visats som visar tillgängliga fält, inklusive Omdöme, som markeras automatiskt i listan. När utvecklaren klickar på fältet eller trycker på Retur på tangentbordet anges värdet till Omdöme.

Lägg till Rating egenskapen i de återstående Create.cshtml, Delete.cshtml, Details.cshtml, och Edit.cshtml visamallarna.

Uppdatera klassen SeedData så att den ger ett värde för den nya kolumnen. En exempeländring visas nedan, men du vill göra den här ändringen för varje new Movie.

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

Appen fungerar inte förrän databasen har uppdaterats för att inkludera det nya fältet. Om den körs nu genereras följande SqlException :

SqlException: Invalid column name 'Rating'.

Det här felet beror på att den uppdaterade klassen Filmmodell skiljer sig från schemat för tabellen Film i den befintliga databasen. (Det finns ingen Rating kolumn i databastabellen.)

Det finns några metoder för att lösa felet:

  1. Låt Entity Framework automatiskt släppa och återskapa databasen baserat på det nya modellklassschemat. Den här metoden är mycket praktisk tidigt i utvecklingscykeln när du utvecklar aktivt i en testdatabas. Det gör att du snabbt kan utveckla modellen och databasschemat tillsammans. Nackdelen är dock att du förlorar befintliga data i databasen – så du vill inte använda den här metoden i en produktionsdatabas! Att använda en initialiserare för att automatiskt seeda en databas med testdata är ofta ett produktivt sätt att utveckla ett program. Detta är en bra metod för tidig utveckling och när du använder SQLite.

  2. Ändra uttryckligen schemat för den befintliga databasen så att den matchar modellklasserna. Fördelen med den här metoden är att du behåller dina data. Du kan göra den här ändringen antingen manuellt eller genom att skapa ett databasändringsskript.

  3. Använd Entity Framework-migreringar för att uppdatera databasschemat.

I den här guiden används Entity Framework-migreringar.

På menyn Verktyg väljer du NuGet Package Manager > Package Manager Console.

PMC-meny

I Package Manager-konsolen anger du följande kommando:

Add-Migration Rating

Kommandot Add-Migration instruerar migreringsramverket att undersöka den aktuella Movie modellen med det aktuella Movie DB-schemat och skapa den kod som krävs för att migrera databasen till den nya modellen.

Namnet "Rating" är godtyckligt och används för att namnge migreringsfilen. Det är bra att använda ett beskrivande namn för migreringsfilen.

Om alla poster i databasdatabasen tas bort kommer metoden initialize att seeda db:en och inkludera fältet Rating .

I Package Manager-konsolen anger du följande kommando:

Update-Database

Kommandot Update-Database kör up-metoden i migreringar som inte har tillämpats.

Kör appen och kontrollera att du kan skapa, redigera och visa filmer med ett Rating fält.

I det här avsnittet används Entity Framework Code First Migrations för att:

  • Lägg till ett nytt fält i modellen.
  • Migrera det nya fältet till databasen.

När EF Code First används för att automatiskt skapa en databas, Code First:

  • Lägger till en tabell i databasen för att spåra schemat för databasen.
  • Verifierar att databasen är synkroniserad med de modellklasser som den genererades från. Om de inte är synkroniserade utlöser EF ett undantag. Detta gör det enklare att hitta inkonsekventa problem med databas/kod.

Lägga till en klassificeringsegenskap i filmmodellen

Lägg till en Rating egenskap i Models/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; }
}

Skapa appen

Tryck på Ctrl+Skift+B

Eftersom du har lagt till ett nytt fält i Movie klassen måste du uppdatera egenskapsbindningslistan så att den nya egenskapen inkluderas. I MoviesController.csuppdaterar du [Bind] attributet för både åtgärdsmetoderna Create och Edit så att egenskapen inkluderas Rating :

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

Uppdatera vymallarna för att visa, skapa och redigera den nya Rating egenskapen i webbläsarvyn.

/Views/Movies/Index.cshtml Redigera filen och lägg till ett Rating fält:

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

Uppdatera /Views/Movies/Create.cshtml med ett Rating fält.

Du kan kopiera/klistra in den tidigare "formulärgruppen" och låta intelliSense hjälpa dig att uppdatera fälten. IntelliSense fungerar med Tag Helpers.

Utvecklaren har skrivit bokstaven R för attributvärdet asp-for i det andra etikettelementet i vyn. En Intellisense-snabbmeny har visats som visar tillgängliga fält, inklusive Omdöme, som markeras automatiskt i listan. När utvecklaren klickar på fältet eller trycker på Retur på tangentbordet anges värdet till Omdöme.

Uppdatera de återstående mallarna.

Uppdatera klassen SeedData så att den ger ett värde för den nya kolumnen. En exempeländring visas nedan, men du vill göra den här ändringen för varje new Movie.

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

Appen fungerar inte förrän databasen har uppdaterats för att inkludera det nya fältet. Om den körs nu genereras följande SqlException :

SqlException: Invalid column name 'Rating'.

Det här felet beror på att den uppdaterade klassen Filmmodell skiljer sig från schemat för tabellen Film i den befintliga databasen. (Det finns ingen Rating kolumn i databastabellen.)

Det finns några metoder för att lösa felet:

  1. Låt Entity Framework automatiskt släppa och återskapa databasen baserat på det nya modellklassschemat. Den här metoden är mycket praktisk tidigt i utvecklingscykeln när du utvecklar aktivt i en testdatabas. Det gör att du snabbt kan utveckla modellen och databasschemat tillsammans. Nackdelen är dock att du förlorar befintliga data i databasen – så du vill inte använda den här metoden i en produktionsdatabas! Att använda en initialiserare för att automatiskt seeda en databas med testdata är ofta ett produktivt sätt att utveckla ett program. Detta är en bra metod för tidig utveckling och när du använder SQLite.

  2. Ändra uttryckligen schemat för den befintliga databasen så att den matchar modellklasserna. Fördelen med den här metoden är att du behåller dina data. Du kan göra den här ändringen antingen manuellt eller genom att skapa ett databasändringsskript.

  3. Använd Code First Migrations för att uppdatera databasschemat.

I den här handledningen används Code First Migrations.

På menyn Verktyg väljer du NuGet Package Manager > Package Manager Console.

PMC-meny

I PMC anger du följande kommandon:

Add-Migration Rating
Update-Database

Kommandot Add-Migration instruerar migreringsramverket att undersöka den aktuella Movie modellen med det aktuella Movie DB-schemat och skapa den kod som krävs för att migrera databasen till den nya modellen.

Namnet "Rating" är godtyckligt och används för att namnge migreringsfilen. Det är bra att använda ett beskrivande namn för migreringsfilen.

Om alla poster i databasdatabasen tas bort kommer metoden initialize att seeda db:en och inkludera fältet Rating .

Kör appen och kontrollera att du kan skapa, redigera och visa filmer med ett Rating fält.

I det här avsnittet används Entity Framework Code First Migrations för att:

  • Lägg till ett nytt fält i modellen.
  • Migrera det nya fältet till databasen.

När EF Code First används för att automatiskt skapa en databas, Code First:

  • Lägger till en tabell i databasen för att spåra schemat för databasen.
  • Verifierar att databasen är synkroniserad med de modellklasser som den genererades från. Om de inte är synkroniserade utlöser EF ett undantag. Detta gör det enklare att hitta inkonsekventa problem med databas/kod.

Lägga till en klassificeringsegenskap i filmmodellen

Lägg till en Rating egenskap i Models/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; }
}

Skapa appen

Tryck på Ctrl+Skift+B

Eftersom du har lagt till ett nytt fält i Movie klassen måste du uppdatera egenskapsbindningslistan så att den nya egenskapen inkluderas. I MoviesController.csuppdaterar du [Bind] attributet för både åtgärdsmetoderna Create och Edit så att egenskapen inkluderas Rating :

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

Uppdatera vymallarna för att visa, skapa och redigera den nya Rating egenskapen i webbläsarvyn.

/Views/Movies/Index.cshtml Redigera filen och lägg till ett Rating fält:

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

Uppdatera /Views/Movies/Create.cshtml med ett Rating fält.

Du kan kopiera/klistra in den tidigare "formulärgruppen" och låta intelliSense hjälpa dig att uppdatera fälten. IntelliSense fungerar med Tag Helpers.

Utvecklaren har skrivit bokstaven R för attributvärdet asp-for i det andra etikettelementet i vyn. En Intellisense-snabbmeny har visats som visar tillgängliga fält, inklusive Omdöme, som markeras automatiskt i listan. När utvecklaren klickar på fältet eller trycker på Retur på tangentbordet anges värdet till Omdöme.

Uppdatera de återstående mallarna.

Uppdatera klassen SeedData så att den ger ett värde för den nya kolumnen. En exempeländring visas nedan, men du vill göra den här ändringen för varje new Movie.

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

Appen fungerar inte förrän databasen har uppdaterats för att inkludera det nya fältet. Om den körs nu genereras följande SqlException :

SqlException: Invalid column name 'Rating'.

Det här felet beror på att den uppdaterade klassen Filmmodell skiljer sig från schemat för tabellen Film i den befintliga databasen. (Det finns ingen Rating kolumn i databastabellen.)

Det finns några metoder för att lösa felet:

  1. Låt Entity Framework automatiskt släppa och återskapa databasen baserat på det nya modellklassschemat. Den här metoden är mycket praktisk tidigt i utvecklingscykeln när du utvecklar aktivt i en testdatabas. Det gör att du snabbt kan utveckla modellen och databasschemat tillsammans. Nackdelen är dock att du förlorar befintliga data i databasen – så du vill inte använda den här metoden i en produktionsdatabas! Att använda en initialiserare för att automatiskt seeda en databas med testdata är ofta ett produktivt sätt att utveckla ett program. Detta är en bra metod för tidig utveckling och när du använder SQLite.

  2. Ändra uttryckligen schemat för den befintliga databasen så att den matchar modellklasserna. Fördelen med den här metoden är att du behåller dina data. Du kan göra den här ändringen antingen manuellt eller genom att skapa ett databasändringsskript.

  3. Använd Code First Migrations för att uppdatera databasschemat.

I den här handledningen används Code First Migrations.

På menyn Verktyg väljer du NuGet Package Manager > Package Manager Console.

PMC-meny

I PMC anger du följande kommandon:

Add-Migration Rating
Update-Database

Kommandot Add-Migration instruerar migreringsramverket att undersöka den aktuella Movie modellen med det aktuella Movie DB-schemat och skapa den kod som krävs för att migrera databasen till den nya modellen.

Namnet "Rating" är godtyckligt och används för att namnge migreringsfilen. Det är bra att använda ett beskrivande namn för migreringsfilen.

Om alla poster i databasdatabasen tas bort kommer metoden initialize att seeda db:en och inkludera fältet Rating .

Kör appen och kontrollera att du kan skapa, redigera och visa filmer med ett Rating fält.

I det här avsnittet används Entity Framework Code First Migrations för att:

  • Lägg till ett nytt fält i modellen.
  • Migrera det nya fältet till databasen.

När EF Code First används för att automatiskt skapa en databas, Code First:

  • Lägger till en tabell i databasen för att spåra schemat för databasen.
  • Verifierar att databasen är synkroniserad med de modellklasser som den genererades från. Om de inte är synkroniserade utlöser EF ett undantag. Detta gör det enklare att hitta inkonsekventa problem med databas/kod.

Lägga till en klassificeringsegenskap i filmmodellen

Lägg till en Rating egenskap i Models/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; }
    }
}

Skapa appen

Ctrl+Skift+B

Eftersom du har lagt till ett nytt fält i Movie klassen måste du uppdatera egenskapsbindningslistan så att den nya egenskapen inkluderas. I MoviesController.csuppdaterar du [Bind] attributet för både åtgärdsmetoderna Create och Edit så att egenskapen inkluderas Rating :

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

Uppdatera vymallarna för att visa, skapa och redigera den nya Rating egenskapen i webbläsarvyn.

/Views/Movies/Index.cshtml Redigera filen och lägg till ett Rating fält:

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

Uppdatera /Views/Movies/Create.cshtml med ett Rating fält.

Du kan kopiera/klistra in den tidigare "formulärgruppen" och låta intelliSense hjälpa dig att uppdatera fälten. IntelliSense fungerar med Tag Helpers.

Utvecklaren har skrivit bokstaven R för attributvärdet asp-for i det andra etikettelementet i vyn. En Intellisense-snabbmeny har visats som visar tillgängliga fält, inklusive Omdöme, som markeras automatiskt i listan. När utvecklaren klickar på fältet eller trycker på Retur på tangentbordet anges värdet till Omdöme.

Uppdatera de återstående mallarna.

Uppdatera klassen SeedData så att den ger ett värde för den nya kolumnen. En exempeländring visas nedan, men du vill göra den här ändringen för varje new Movie.

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

Appen fungerar inte förrän databasen har uppdaterats för att inkludera det nya fältet. Om den körs nu genereras följande SqlException :

SqlException: Invalid column name 'Rating'.

Det här felet beror på att den uppdaterade klassen Filmmodell skiljer sig från schemat för tabellen Film i den befintliga databasen. (Det finns ingen Rating kolumn i databastabellen.)

Det finns några metoder för att lösa felet:

  1. Låt Entity Framework automatiskt släppa och återskapa databasen baserat på det nya modellklassschemat. Den här metoden är mycket praktisk tidigt i utvecklingscykeln när du utvecklar aktivt i en testdatabas. Det gör att du snabbt kan utveckla modellen och databasschemat tillsammans. Nackdelen är dock att du förlorar befintliga data i databasen – så du vill inte använda den här metoden i en produktionsdatabas! Att använda en initialiserare för att automatiskt seeda en databas med testdata är ofta ett produktivt sätt att utveckla ett program. Detta är en bra metod för tidig utveckling och när du använder SQLite.

  2. Ändra uttryckligen schemat för den befintliga databasen så att den matchar modellklasserna. Fördelen med den här metoden är att du behåller dina data. Du kan göra den här ändringen antingen manuellt eller genom att skapa ett databasändringsskript.

  3. Använd Code First Migrations för att uppdatera databasschemat.

I den här handledningen används Code First Migrations.

På menyn Verktyg väljer du NuGet Package Manager > Package Manager Console.

PMC-meny

I PMC anger du följande kommandon:

Add-Migration Rating
Update-Database

Kommandot Add-Migration instruerar migreringsramverket att undersöka den aktuella Movie modellen med det aktuella Movie DB-schemat och skapa den kod som krävs för att migrera databasen till den nya modellen.

Namnet "Rating" är godtyckligt och används för att namnge migreringsfilen. Det är bra att använda ett beskrivande namn för migreringsfilen.

Om alla poster i databasdatabasen tas bort kommer metoden initialize att seeda db:en och inkludera fältet Rating .

Kör appen och kontrollera att du kan skapa, redigera och visa filmer med ett Rating fält.

I det här avsnittet används Entity Framework Code First Migrations för att:

  • Lägg till ett nytt fält i modellen.
  • Migrera det nya fältet till databasen.

När EF Code First används för att automatiskt skapa en databas, Code First:

  • Lägger till en tabell i databasen för att spåra schemat för databasen.
  • Verifierar att databasen är synkroniserad med de modellklasser som den genererades från. Om de inte är synkroniserade utlöser EF ett undantag. Detta gör det enklare att hitta inkonsekventa problem med databas/kod.

Lägga till en klassificeringsegenskap i filmmodellen

Lägg till en Rating egenskap i Models/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; }
    }
}

Skapa appen

Ctrl+Skift+B

Eftersom du har lagt till ett nytt fält i Movie klassen måste du uppdatera egenskapsbindningslistan så att den nya egenskapen inkluderas. I MoviesController.csuppdaterar du [Bind] attributet för både åtgärdsmetoderna Create och Edit så att egenskapen inkluderas Rating :

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

Uppdatera vymallarna för att visa, skapa och redigera den nya Rating egenskapen i webbläsarvyn.

/Views/Movies/Index.cshtml Redigera filen och lägg till ett Rating fält:

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

Uppdatera /Views/Movies/Create.cshtml med ett Rating fält.

Du kan kopiera/klistra in den tidigare "formulärgruppen" och låta intelliSense hjälpa dig att uppdatera fälten. IntelliSense fungerar med Tag Helpers.

Utvecklaren har skrivit bokstaven R för attributvärdet asp-for i det andra etikettelementet i vyn. En Intellisense-snabbmeny har visats som visar tillgängliga fält, inklusive Omdöme, som markeras automatiskt i listan. När utvecklaren klickar på fältet eller trycker på Retur på tangentbordet anges värdet till Omdöme.

Uppdatera de återstående mallarna.

Uppdatera klassen SeedData så att den ger ett värde för den nya kolumnen. En exempeländring visas nedan, men du vill göra den här ändringen för varje new Movie.

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

Appen fungerar inte förrän databasen har uppdaterats för att inkludera det nya fältet. Om den körs nu genereras följande SqlException :

SqlException: Invalid column name 'Rating'.

Det här felet beror på att den uppdaterade klassen Filmmodell skiljer sig från schemat för tabellen Film i den befintliga databasen. (Det finns ingen Rating kolumn i databastabellen.)

Det finns några metoder för att lösa felet:

  1. Låt Entity Framework automatiskt släppa och återskapa databasen baserat på det nya modellklassschemat. Den här metoden är mycket praktisk tidigt i utvecklingscykeln när du utvecklar aktivt i en testdatabas. Det gör att du snabbt kan utveckla modellen och databasschemat tillsammans. Nackdelen är dock att du förlorar befintliga data i databasen – så du vill inte använda den här metoden i en produktionsdatabas! Att använda en initialiserare för att automatiskt seeda en databas med testdata är ofta ett produktivt sätt att utveckla ett program. Detta är en bra metod för tidig utveckling och när du använder SQLite.

  2. Ändra uttryckligen schemat för den befintliga databasen så att den matchar modellklasserna. Fördelen med den här metoden är att du behåller dina data. Du kan göra den här ändringen antingen manuellt eller genom att skapa ett databasändringsskript.

  3. Använd Code First Migrations för att uppdatera databasschemat.

I den här handledningen används Code First Migrations.

På menyn Verktyg väljer du NuGet Package Manager > Package Manager Console.

PMC-meny

I PMC anger du följande kommandon:

Add-Migration Rating
Update-Database

Kommandot Add-Migration instruerar migreringsramverket att undersöka den aktuella Movie modellen med det aktuella Movie DB-schemat och skapa den kod som krävs för att migrera databasen till den nya modellen.

Namnet "Rating" är godtyckligt och används för att namnge migreringsfilen. Det är bra att använda ett beskrivande namn för migreringsfilen.

Om alla poster i databasdatabasen tas bort kommer metoden initialize att seeda db:en och inkludera fältet Rating .

Kör appen och kontrollera att du kan skapa, redigera och visa filmer med ett Rating fält.

I det här avsnittet används Entity Framework Code First Migrations för att:

  • Lägg till ett nytt fält i modellen.
  • Migrera det nya fältet till databasen.

När EF Code First används för att automatiskt skapa en databas, Code First:

  • Lägger till en tabell i databasen för att spåra schemat för databasen.
  • Verifierar att databasen är synkroniserad med de modellklasser som den genererades från. Om de inte är synkroniserade utlöser EF ett undantag. Detta gör det enklare att hitta inkonsekventa problem med databas/kod.

Lägga till en klassificeringsegenskap i filmmodellen

Lägg till en Rating egenskap i Models/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; }
    }
}

Skapa appen

Ctrl+Skift+B

Eftersom du har lagt till ett nytt fält i Movie klassen måste du uppdatera egenskapsbindningslistan så att den nya egenskapen inkluderas. I MoviesController.csuppdaterar du [Bind] attributet för både åtgärdsmetoderna Create och Edit så att egenskapen inkluderas Rating :

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

Uppdatera vymallarna för att visa, skapa och redigera den nya Rating egenskapen i webbläsarvyn.

/Views/Movies/Index.cshtml Redigera filen och lägg till ett Rating fält:

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

Uppdatera /Views/Movies/Create.cshtml med ett Rating fält.

Du kan kopiera/klistra in den tidigare "formulärgruppen" och låta intelliSense hjälpa dig att uppdatera fälten. IntelliSense fungerar med Tag Helpers.

Utvecklaren har skrivit bokstaven R för attributvärdet asp-for i det andra etikettelementet i vyn. En Intellisense-snabbmeny har visats som visar tillgängliga fält, inklusive Omdöme, som markeras automatiskt i listan. När utvecklaren klickar på fältet eller trycker på Retur på tangentbordet anges värdet till Omdöme.

Uppdatera de återstående mallarna.

Uppdatera klassen SeedData så att den ger ett värde för den nya kolumnen. En exempeländring visas nedan, men du vill göra den här ändringen för varje new Movie.

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

Appen fungerar inte förrän databasen har uppdaterats för att inkludera det nya fältet. Om den körs nu genereras följande SqlException :

SqlException: Invalid column name 'Rating'.

Det här felet beror på att den uppdaterade klassen Filmmodell skiljer sig från schemat för tabellen Film i den befintliga databasen. (Det finns ingen Rating kolumn i databastabellen.)

Det finns några metoder för att lösa felet:

  1. Låt Entity Framework automatiskt släppa och återskapa databasen baserat på det nya modellklassschemat. Den här metoden är mycket praktisk tidigt i utvecklingscykeln när du utvecklar aktivt i en testdatabas. Det gör att du snabbt kan utveckla modellen och databasschemat tillsammans. Nackdelen är dock att du förlorar befintliga data i databasen – så du vill inte använda den här metoden i en produktionsdatabas! Att använda en initialiserare för att automatiskt seeda en databas med testdata är ofta ett produktivt sätt att utveckla ett program. Detta är en bra metod för tidig utveckling och när du använder SQLite.

  2. Ändra uttryckligen schemat för den befintliga databasen så att den matchar modellklasserna. Fördelen med den här metoden är att du behåller dina data. Du kan göra den här ändringen antingen manuellt eller genom att skapa ett databasändringsskript.

  3. Använd Code First Migrations för att uppdatera databasschemat.

I den här handledningen används Code First Migrations.

På menyn Verktyg väljer du NuGet Package Manager > Package Manager Console.

PMC-meny

I PMC anger du följande kommandon:

Add-Migration Rating
Update-Database

Kommandot Add-Migration instruerar migreringsramverket att undersöka den aktuella Movie modellen med det aktuella Movie DB-schemat och skapa den kod som krävs för att migrera databasen till den nya modellen.

Namnet "Rating" är godtyckligt och används för att namnge migreringsfilen. Det är bra att använda ett beskrivande namn för migreringsfilen.

Om alla poster i databasdatabasen tas bort kommer metoden initialize att seeda db:en och inkludera fältet Rating .

Kör appen och kontrollera att du kan skapa, redigera och visa filmer med ett Rating fält.