Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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.
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:
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.
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.
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.
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.
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:
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.
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.
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.
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.
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:
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.
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.
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.
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.
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:
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.
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.
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.
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.
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:
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.
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.
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.
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.
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:
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.
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.
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.
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.