Partilhar via


Parte 8, adicionar um novo campo a um aplicativo ASP.NET Core MVC

Observação

Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 10 deste artigo.

Advertência

Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e do .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.

Por Rick Anderson

Nesta seção, as migrações do Entity Framework são usadas para:

  • Adicione um novo campo ao modelo.
  • Migre o novo campo para o banco de dados.

Quando o Entity Framework (EF) é usado para criar automaticamente um banco de dados a partir de classes de modelo:

  • Uma tabela é adicionada ao banco de dados para controlar o esquema do banco de dados.
  • Verifica-se que o banco de dados está em sincronia com as classes de modelo a partir das quais foi gerado. Se eles não estiverem sincronizados, EF lançará uma exceção. Isso facilita a localização de problemas inconsistentes de banco de dados/código.

Adicionar uma propriedade de classificação ao modelo de filme

Adicionar uma Rating propriedade a 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; }
}

Crie o aplicativo

Pressione Ctrl+Shift+B

Como você adicionou um novo campo à Movie classe, precisa atualizar a lista de vinculação de propriedades para que essa nova propriedade seja incluída. No MoviesController.cs, atualize o atributo [Bind] para os métodos de ação Create e Edit para incluir a propriedade Rating.

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

Atualize os modelos de exibição para exibir, criar e editar a nova Rating propriedade na visualização do navegador.

Edite o /Views/Movies/Index.cshtml arquivo e adicione um Rating campo:

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

Atualize o /Views/Movies/Create.cshtml com um campo Rating.

Você pode copiar/colar o "grupo de formulários" anterior e deixar o intelliSense ajudá-lo a atualizar os campos. O IntelliSense funciona com Tag Helpers.

O desenvolvedor digitou a letra R para o valor do atributo asp-for no segundo elemento label da exibição. Um menu contextual do Intellisense apareceu mostrando os campos disponíveis, incluindo Classificação, que é realçado na lista automaticamente. Quando o desenvolvedor clica no campo ou pressiona Enter no teclado, o valor será definido como Classificação.

Adicione a propriedade Rating aos modelos de visualização restantes Create.cshtml, Delete.cshtml, Details.cshtml e Edit.cshtml.

Atualize a classe SeedData para que ela forneça um valor para a nova coluna. Um exemplo de alteração é mostrado abaixo, mas você desejará fazer essa alteração para cada new Movie.

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

O aplicativo não funcionará até que o banco de dados seja atualizado para incluir o novo campo. Se for executado agora, o seguinte SqlException será gerado:

SqlException: Invalid column name 'Rating'.

Este erro ocorre porque a classe de modelo Movie atualizada é diferente do esquema da tabela Movie do banco de dados existente. (Não há coluna Rating na tabela do banco de dados.)

Existem algumas abordagens para resolver o erro:

  1. Faça com que o Entity Framework solte automaticamente e recrie o banco de dados com base no novo esquema de classe de modelo. Essa abordagem é muito conveniente no início do ciclo de desenvolvimento, quando você está fazendo desenvolvimento ativo em um banco de dados de teste; Ele permite que você evolua rapidamente o modelo e o esquema de banco de dados juntos. A desvantagem, porém, é que você perde dados existentes no banco de dados — portanto, não quer usar essa abordagem em um banco de dados de produção! Usar um inicializador para semear automaticamente um banco de dados com dados de teste geralmente é uma maneira produtiva de desenvolver um aplicativo. Esta é uma boa abordagem para o desenvolvimento inicial e ao usar SQLite.

  2. Modifique explicitamente o esquema do banco de dados existente para que ele corresponda às classes de modelo. A vantagem dessa abordagem é que você mantém seus dados. Você pode fazer essa alteração manualmente ou criando um script de alteração de banco de dados.

  3. Use as migrações do Entity Framework para atualizar o esquema do banco de dados.

Para este tutorial, as migrações do Entity Framework são usadas.

No menu Ferramentas, selecione Gestor de Pacotes NuGet > Consola do Gestor de Pacotes.

menu PMC

No Console do Gerenciador de Pacotes, digite o seguinte comando:

Add-Migration Rating

O Add-Migration comando diz à estrutura de migração para examinar o modelo atual Movie com o esquema de banco de dados atual Movie e criar o código necessário para migrar o banco de dados para o novo modelo.

O nome "Classificação" é arbitrário e é usado para nomear o arquivo de migração. É útil usar um nome significativo para o arquivo de migração.

Se todos os registros no banco de dados forem excluídos, o método initialize semeará o banco de dados e incluirá o Rating campo.

No Console do Gerenciador de Pacotes, digite o seguinte comando:

Update-Database

O comando Update-Database executa o método Up em migrações que não foram aplicadas.

Execute o aplicativo e verifique se você pode criar, editar e exibir filmes com um campo Rating.

Nesta seção, Entity Framework Code First Migrations é usado para:

  • Adicione um novo campo ao modelo.
  • Migre o novo campo para o banco de dados.

Quando o EF Code First é usado para criar automaticamente um banco de dados, o Code First:

  • Adiciona uma tabela ao banco de dados para controlar o esquema do banco de dados.
  • Verifica se o banco de dados está sincronizado com as classes de modelo a partir das quais foi gerado. Se eles não estiverem sincronizados, EF lançará uma exceção. Isso facilita a localização de problemas inconsistentes de banco de dados/código.

Adicionar uma propriedade de classificação ao modelo de filme

Adicionar uma Rating propriedade a 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; }
}

Crie o aplicativo

Pressione Ctrl+Shift+B

Como você adicionou um novo campo à Movie classe, precisa atualizar a lista de vinculação de propriedades para que essa nova propriedade seja incluída. No MoviesController.cs, atualize o atributo [Bind] para os métodos de ação Create e Edit para incluir a propriedade Rating.

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

Atualize os modelos de exibição para exibir, criar e editar a nova Rating propriedade na visualização do navegador.

Edite o /Views/Movies/Index.cshtml arquivo e adicione um Rating campo:

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

Atualize o /Views/Movies/Create.cshtml com um campo Rating.

Você pode copiar/colar o "grupo de formulários" anterior e deixar o intelliSense ajudá-lo a atualizar os campos. O IntelliSense funciona com Tag Helpers.

O desenvolvedor digitou a letra R para o valor do atributo asp-for no segundo elemento label da exibição. Um menu contextual do Intellisense apareceu mostrando os campos disponíveis, incluindo Classificação, que é realçado na lista automaticamente. Quando o desenvolvedor clica no campo ou pressiona Enter no teclado, o valor será definido como Classificação.

Atualize os modelos restantes.

Atualize a classe SeedData para que ela forneça um valor para a nova coluna. Um exemplo de alteração é mostrado abaixo, mas você desejará fazer essa alteração para cada new Movie.

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

O aplicativo não funcionará até que o banco de dados seja atualizado para incluir o novo campo. Se for executado agora, o seguinte SqlException será gerado:

SqlException: Invalid column name 'Rating'.

Este erro ocorre porque a classe de modelo Movie atualizada é diferente do esquema da tabela Movie do banco de dados existente. (Não há coluna Rating na tabela do banco de dados.)

Existem algumas abordagens para resolver o erro:

  1. Faça com que o Entity Framework solte automaticamente e recrie o banco de dados com base no novo esquema de classe de modelo. Essa abordagem é muito conveniente no início do ciclo de desenvolvimento, quando você está fazendo desenvolvimento ativo em um banco de dados de teste; Ele permite que você evolua rapidamente o modelo e o esquema de banco de dados juntos. A desvantagem, porém, é que você perde dados existentes no banco de dados — portanto, não quer usar essa abordagem em um banco de dados de produção! Usar um inicializador para semear automaticamente um banco de dados com dados de teste geralmente é uma maneira produtiva de desenvolver um aplicativo. Esta é uma boa abordagem para o desenvolvimento inicial e ao usar SQLite.

  2. Modifique explicitamente o esquema do banco de dados existente para que ele corresponda às classes de modelo. A vantagem dessa abordagem é que você mantém seus dados. Você pode fazer essa alteração manualmente ou criando um script de alteração de banco de dados.

  3. Use as migrações Code First para atualizar o esquema do banco de dados.

Para este tutorial, é utilizada a ferramenta Code First Migrations.

No menu Ferramentas, selecione Gestor de Pacotes NuGet > Consola do Gestor de Pacotes.

menu PMC

No PMC, digite os seguintes comandos:

Add-Migration Rating
Update-Database

O Add-Migration comando diz à estrutura de migração para examinar o modelo atual Movie com o esquema de banco de dados atual Movie e criar o código necessário para migrar o banco de dados para o novo modelo.

O nome "Classificação" é arbitrário e é usado para nomear o arquivo de migração. É útil usar um nome significativo para o arquivo de migração.

Se todos os registros no banco de dados forem excluídos, o método initialize semeará o banco de dados e incluirá o Rating campo.

Execute o aplicativo e verifique se você pode criar, editar e exibir filmes com um campo Rating.

Nesta seção, Entity Framework Code First Migrations é usado para:

  • Adicione um novo campo ao modelo.
  • Migre o novo campo para o banco de dados.

Quando o EF Code First é usado para criar automaticamente um banco de dados, o Code First:

  • Adiciona uma tabela ao banco de dados para controlar o esquema do banco de dados.
  • Verifica se o banco de dados está sincronizado com as classes de modelo a partir das quais foi gerado. Se eles não estiverem sincronizados, EF lançará uma exceção. Isso facilita a localização de problemas inconsistentes de banco de dados/código.

Adicionar uma propriedade de classificação ao modelo de filme

Adicionar uma Rating propriedade a 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; }
}

Crie o aplicativo

Pressione Ctrl+Shift+B

Como você adicionou um novo campo à Movie classe, precisa atualizar a lista de vinculação de propriedades para que essa nova propriedade seja incluída. No MoviesController.cs, atualize o atributo [Bind] para os métodos de ação Create e Edit para incluir a propriedade Rating.

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

Atualize os modelos de exibição para exibir, criar e editar a nova Rating propriedade na visualização do navegador.

Edite o /Views/Movies/Index.cshtml arquivo e adicione um Rating campo:

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

Atualize o /Views/Movies/Create.cshtml com um campo Rating.

Você pode copiar/colar o "grupo de formulários" anterior e deixar o intelliSense ajudá-lo a atualizar os campos. O IntelliSense funciona com Tag Helpers.

O desenvolvedor digitou a letra R para o valor do atributo asp-for no segundo elemento label da exibição. Um menu contextual do Intellisense apareceu mostrando os campos disponíveis, incluindo Classificação, que é realçado na lista automaticamente. Quando o desenvolvedor clica no campo ou pressiona Enter no teclado, o valor será definido como Classificação.

Atualize os modelos restantes.

Atualize a classe SeedData para que ela forneça um valor para a nova coluna. Um exemplo de alteração é mostrado abaixo, mas você desejará fazer essa alteração para cada new Movie.

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

O aplicativo não funcionará até que o banco de dados seja atualizado para incluir o novo campo. Se for executado agora, o seguinte SqlException será gerado:

SqlException: Invalid column name 'Rating'.

Este erro ocorre porque a classe de modelo Movie atualizada é diferente do esquema da tabela Movie do banco de dados existente. (Não há coluna Rating na tabela do banco de dados.)

Existem algumas abordagens para resolver o erro:

  1. Faça com que o Entity Framework solte automaticamente e recrie o banco de dados com base no novo esquema de classe de modelo. Essa abordagem é muito conveniente no início do ciclo de desenvolvimento, quando você está fazendo desenvolvimento ativo em um banco de dados de teste; Ele permite que você evolua rapidamente o modelo e o esquema de banco de dados juntos. A desvantagem, porém, é que você perde dados existentes no banco de dados — portanto, não quer usar essa abordagem em um banco de dados de produção! Usar um inicializador para semear automaticamente um banco de dados com dados de teste geralmente é uma maneira produtiva de desenvolver um aplicativo. Esta é uma boa abordagem para o desenvolvimento inicial e ao usar SQLite.

  2. Modifique explicitamente o esquema do banco de dados existente para que ele corresponda às classes de modelo. A vantagem dessa abordagem é que você mantém seus dados. Você pode fazer essa alteração manualmente ou criando um script de alteração de banco de dados.

  3. Use as migrações Code First para atualizar o esquema do banco de dados.

Para este tutorial, é utilizada a ferramenta Code First Migrations.

No menu Ferramentas, selecione Gestor de Pacotes NuGet > Consola do Gestor de Pacotes.

menu PMC

No PMC, digite os seguintes comandos:

Add-Migration Rating
Update-Database

O Add-Migration comando diz à estrutura de migração para examinar o modelo atual Movie com o esquema de banco de dados atual Movie e criar o código necessário para migrar o banco de dados para o novo modelo.

O nome "Classificação" é arbitrário e é usado para nomear o arquivo de migração. É útil usar um nome significativo para o arquivo de migração.

Se todos os registros no banco de dados forem excluídos, o método initialize semeará o banco de dados e incluirá o Rating campo.

Execute o aplicativo e verifique se você pode criar, editar e exibir filmes com um campo Rating.

Nesta seção, Entity Framework Code First Migrations é usado para:

  • Adicione um novo campo ao modelo.
  • Migre o novo campo para o banco de dados.

Quando o EF Code First é usado para criar automaticamente um banco de dados, o Code First:

  • Adiciona uma tabela ao banco de dados para controlar o esquema do banco de dados.
  • Verifica se o banco de dados está sincronizado com as classes de modelo a partir das quais foi gerado. Se eles não estiverem sincronizados, EF lançará uma exceção. Isso facilita a localização de problemas inconsistentes de banco de dados/código.

Adicionar uma propriedade de classificação ao modelo de filme

Adicionar uma Rating propriedade a 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; }
    }
}

Crie o aplicativo

Ctrl+Shift+B

Como você adicionou um novo campo à Movie classe, precisa atualizar a lista de vinculação de propriedades para que essa nova propriedade seja incluída. No MoviesController.cs, atualize o atributo [Bind] para os métodos de ação Create e Edit para incluir a propriedade Rating.

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

Atualize os modelos de exibição para exibir, criar e editar a nova Rating propriedade na visualização do navegador.

Edite o /Views/Movies/Index.cshtml arquivo e adicione um Rating campo:

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

Atualize o /Views/Movies/Create.cshtml com um campo Rating.

Você pode copiar/colar o "grupo de formulários" anterior e deixar o intelliSense ajudá-lo a atualizar os campos. O IntelliSense funciona com Tag Helpers.

O desenvolvedor digitou a letra R para o valor do atributo asp-for no segundo elemento label da exibição. Um menu contextual do Intellisense apareceu mostrando os campos disponíveis, incluindo Classificação, que é realçado na lista automaticamente. Quando o desenvolvedor clica no campo ou pressiona Enter no teclado, o valor será definido como Classificação.

Atualize os modelos restantes.

Atualize a classe SeedData para que ela forneça um valor para a nova coluna. Um exemplo de alteração é mostrado abaixo, mas você desejará fazer essa alteração para cada new Movie.

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

O aplicativo não funcionará até que o banco de dados seja atualizado para incluir o novo campo. Se for executado agora, o seguinte SqlException será gerado:

SqlException: Invalid column name 'Rating'.

Este erro ocorre porque a classe de modelo Movie atualizada é diferente do esquema da tabela Movie do banco de dados existente. (Não há coluna Rating na tabela do banco de dados.)

Existem algumas abordagens para resolver o erro:

  1. Faça com que o Entity Framework solte automaticamente e recrie o banco de dados com base no novo esquema de classe de modelo. Essa abordagem é muito conveniente no início do ciclo de desenvolvimento, quando você está fazendo desenvolvimento ativo em um banco de dados de teste; Ele permite que você evolua rapidamente o modelo e o esquema de banco de dados juntos. A desvantagem, porém, é que você perde dados existentes no banco de dados — portanto, não quer usar essa abordagem em um banco de dados de produção! Usar um inicializador para semear automaticamente um banco de dados com dados de teste geralmente é uma maneira produtiva de desenvolver um aplicativo. Esta é uma boa abordagem para o desenvolvimento inicial e ao usar SQLite.

  2. Modifique explicitamente o esquema do banco de dados existente para que ele corresponda às classes de modelo. A vantagem dessa abordagem é que você mantém seus dados. Você pode fazer essa alteração manualmente ou criando um script de alteração de banco de dados.

  3. Use as migrações Code First para atualizar o esquema do banco de dados.

Para este tutorial, é utilizada a ferramenta Code First Migrations.

No menu Ferramentas, selecione Gestor de Pacotes NuGet > Consola do Gestor de Pacotes.

menu PMC

No PMC, digite os seguintes comandos:

Add-Migration Rating
Update-Database

O Add-Migration comando diz à estrutura de migração para examinar o modelo atual Movie com o esquema de banco de dados atual Movie e criar o código necessário para migrar o banco de dados para o novo modelo.

O nome "Classificação" é arbitrário e é usado para nomear o arquivo de migração. É útil usar um nome significativo para o arquivo de migração.

Se todos os registros no banco de dados forem excluídos, o método initialize semeará o banco de dados e incluirá o Rating campo.

Execute o aplicativo e verifique se você pode criar, editar e exibir filmes com um campo Rating.

Nesta seção, Entity Framework Code First Migrations é usado para:

  • Adicione um novo campo ao modelo.
  • Migre o novo campo para o banco de dados.

Quando o EF Code First é usado para criar automaticamente um banco de dados, o Code First:

  • Adiciona uma tabela ao banco de dados para controlar o esquema do banco de dados.
  • Verifica se o banco de dados está sincronizado com as classes de modelo a partir das quais foi gerado. Se eles não estiverem sincronizados, EF lançará uma exceção. Isso facilita a localização de problemas inconsistentes de banco de dados/código.

Adicionar uma propriedade de classificação ao modelo de filme

Adicionar uma Rating propriedade a 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; }
    }
}

Crie o aplicativo

Ctrl+Shift+B

Como você adicionou um novo campo à Movie classe, precisa atualizar a lista de vinculação de propriedades para que essa nova propriedade seja incluída. No MoviesController.cs, atualize o atributo [Bind] para os métodos de ação Create e Edit para incluir a propriedade Rating.

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

Atualize os modelos de exibição para exibir, criar e editar a nova Rating propriedade na visualização do navegador.

Edite o /Views/Movies/Index.cshtml arquivo e adicione um Rating campo:

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

Atualize o /Views/Movies/Create.cshtml com um campo Rating.

Você pode copiar/colar o "grupo de formulários" anterior e deixar o intelliSense ajudá-lo a atualizar os campos. O IntelliSense funciona com Tag Helpers.

O desenvolvedor digitou a letra R para o valor do atributo asp-for no segundo elemento label da exibição. Um menu contextual do Intellisense apareceu mostrando os campos disponíveis, incluindo Classificação, que é realçado na lista automaticamente. Quando o desenvolvedor clica no campo ou pressiona Enter no teclado, o valor será definido como Classificação.

Atualize os modelos restantes.

Atualize a classe SeedData para que ela forneça um valor para a nova coluna. Um exemplo de alteração é mostrado abaixo, mas você desejará fazer essa alteração para cada new Movie.

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

O aplicativo não funcionará até que o banco de dados seja atualizado para incluir o novo campo. Se for executado agora, o seguinte SqlException será gerado:

SqlException: Invalid column name 'Rating'.

Este erro ocorre porque a classe de modelo Movie atualizada é diferente do esquema da tabela Movie do banco de dados existente. (Não há coluna Rating na tabela do banco de dados.)

Existem algumas abordagens para resolver o erro:

  1. Faça com que o Entity Framework solte automaticamente e recrie o banco de dados com base no novo esquema de classe de modelo. Essa abordagem é muito conveniente no início do ciclo de desenvolvimento, quando você está fazendo desenvolvimento ativo em um banco de dados de teste; Ele permite que você evolua rapidamente o modelo e o esquema de banco de dados juntos. A desvantagem, porém, é que você perde dados existentes no banco de dados — portanto, não quer usar essa abordagem em um banco de dados de produção! Usar um inicializador para semear automaticamente um banco de dados com dados de teste geralmente é uma maneira produtiva de desenvolver um aplicativo. Esta é uma boa abordagem para o desenvolvimento inicial e ao usar SQLite.

  2. Modifique explicitamente o esquema do banco de dados existente para que ele corresponda às classes de modelo. A vantagem dessa abordagem é que você mantém seus dados. Você pode fazer essa alteração manualmente ou criando um script de alteração de banco de dados.

  3. Use as migrações Code First para atualizar o esquema do banco de dados.

Para este tutorial, é utilizada a ferramenta Code First Migrations.

No menu Ferramentas, selecione Gestor de Pacotes NuGet > Consola do Gestor de Pacotes.

menu PMC

No PMC, digite os seguintes comandos:

Add-Migration Rating
Update-Database

O Add-Migration comando diz à estrutura de migração para examinar o modelo atual Movie com o esquema de banco de dados atual Movie e criar o código necessário para migrar o banco de dados para o novo modelo.

O nome "Classificação" é arbitrário e é usado para nomear o arquivo de migração. É útil usar um nome significativo para o arquivo de migração.

Se todos os registros no banco de dados forem excluídos, o método initialize semeará o banco de dados e incluirá o Rating campo.

Execute o aplicativo e verifique se você pode criar, editar e exibir filmes com um campo Rating.

Nesta seção, Entity Framework Code First Migrations é usado para:

  • Adicione um novo campo ao modelo.
  • Migre o novo campo para o banco de dados.

Quando o EF Code First é usado para criar automaticamente um banco de dados, o Code First:

  • Adiciona uma tabela ao banco de dados para controlar o esquema do banco de dados.
  • Verifica se o banco de dados está sincronizado com as classes de modelo a partir das quais foi gerado. Se eles não estiverem sincronizados, EF lançará uma exceção. Isso facilita a localização de problemas inconsistentes de banco de dados/código.

Adicionar uma propriedade de classificação ao modelo de filme

Adicionar uma Rating propriedade a 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; }
    }
}

Crie o aplicativo

Ctrl+Shift+B

Como você adicionou um novo campo à Movie classe, precisa atualizar a lista de vinculação de propriedades para que essa nova propriedade seja incluída. No MoviesController.cs, atualize o atributo [Bind] para os métodos de ação Create e Edit para incluir a propriedade Rating.

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

Atualize os modelos de exibição para exibir, criar e editar a nova Rating propriedade na visualização do navegador.

Edite o /Views/Movies/Index.cshtml arquivo e adicione um Rating campo:

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

Atualize o /Views/Movies/Create.cshtml com um campo Rating.

Você pode copiar/colar o "grupo de formulários" anterior e deixar o intelliSense ajudá-lo a atualizar os campos. O IntelliSense funciona com Tag Helpers.

O desenvolvedor digitou a letra R para o valor do atributo asp-for no segundo elemento label da exibição. Um menu contextual do Intellisense apareceu mostrando os campos disponíveis, incluindo Classificação, que é realçado na lista automaticamente. Quando o desenvolvedor clica no campo ou pressiona Enter no teclado, o valor será definido como Classificação.

Atualize os modelos restantes.

Atualize a classe SeedData para que ela forneça um valor para a nova coluna. Um exemplo de alteração é mostrado abaixo, mas você desejará fazer essa alteração para cada new Movie.

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

O aplicativo não funcionará até que o banco de dados seja atualizado para incluir o novo campo. Se for executado agora, o seguinte SqlException será gerado:

SqlException: Invalid column name 'Rating'.

Este erro ocorre porque a classe de modelo Movie atualizada é diferente do esquema da tabela Movie do banco de dados existente. (Não há coluna Rating na tabela do banco de dados.)

Existem algumas abordagens para resolver o erro:

  1. Faça com que o Entity Framework solte automaticamente e recrie o banco de dados com base no novo esquema de classe de modelo. Essa abordagem é muito conveniente no início do ciclo de desenvolvimento, quando você está fazendo desenvolvimento ativo em um banco de dados de teste; Ele permite que você evolua rapidamente o modelo e o esquema de banco de dados juntos. A desvantagem, porém, é que você perde dados existentes no banco de dados — portanto, não quer usar essa abordagem em um banco de dados de produção! Usar um inicializador para semear automaticamente um banco de dados com dados de teste geralmente é uma maneira produtiva de desenvolver um aplicativo. Esta é uma boa abordagem para o desenvolvimento inicial e ao usar SQLite.

  2. Modifique explicitamente o esquema do banco de dados existente para que ele corresponda às classes de modelo. A vantagem dessa abordagem é que você mantém seus dados. Você pode fazer essa alteração manualmente ou criando um script de alteração de banco de dados.

  3. Use as migrações Code First para atualizar o esquema do banco de dados.

Para este tutorial, é utilizada a ferramenta Code First Migrations.

No menu Ferramentas, selecione Gestor de Pacotes NuGet > Consola do Gestor de Pacotes.

menu PMC

No PMC, digite os seguintes comandos:

Add-Migration Rating
Update-Database

O Add-Migration comando diz à estrutura de migração para examinar o modelo atual Movie com o esquema de banco de dados atual Movie e criar o código necessário para migrar o banco de dados para o novo modelo.

O nome "Classificação" é arbitrário e é usado para nomear o arquivo de migração. É útil usar um nome significativo para o arquivo de migração.

Se todos os registros no banco de dados forem excluídos, o método initialize semeará o banco de dados e incluirá o Rating campo.

Execute o aplicativo e verifique se você pode criar, editar e exibir filmes com um campo Rating.