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.
Note
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 10 deste artigo.
Warning
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 .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.
Por Rick Anderson
Nesta seção, EF Core do Entity Framework Core () é usado para definir o esquema de banco de dados com base na classe de modelo do aplicativo:
- Adicione um novo campo ao modelo.
- Migre a nova alteração de esquema de campo para o banco de dados.
A abordagem EF Core permite um processo de desenvolvimento mais ágil. O desenvolvedor trabalha no modelo de dados do aplicativo diretamente enquanto o esquema de banco de dados é criado e, em seguida, sincronizado, tudo sem que o desenvolvedor tenha que alternar contextos de e para uma ferramenta de gerenciamento de banco de dados. Para obter uma visão geral do Entity Framework Core e seus benefícios, consulte Entity Framework Core.
Usando o EF Code para criar e rastrear automaticamente um banco de dados:
- Adiciona uma tabela
__EFMigrationsHistoryao banco de dados para controlar se o esquema do banco de dados está sincronizado com as classes de modelo a partir das quais foi gerado. - Lança uma exceção se as classes de modelo não estiverem sincronizadas com o banco de dados.
A verificação automática de que o esquema e o modelo estão sincronizados facilita a localização de problemas de código de banco de dados inconsistentes.
Adicionando uma propriedade de classificação ao modelo de filme
Abra o arquivo
Models/Movie.cse adicione uma propriedadeRating:public class Movie { public int Id { get; set; } public string Title { get; set; } = string.Empty; [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } = string.Empty; }Editar
Pages/Movies/Index.cshtmle adicionar um campoRating:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> <label>Title: <input type="text" asp-for="SearchString" /></label> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Rating) </td> <td> <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> | <a asp-page="./Details" asp-route-id="@item.Id">Details</a> | <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a> </td> </tr> } </tbody> </table>Atualize as seguintes páginas com um campo
Rating:
O aplicativo não funcionará até que o banco de dados seja atualizado para incluir o novo campo. A execução do aplicativo sem uma atualização para o banco de dados gera uma SqlException:
SqlException: Invalid column name 'Rating'.
A exceção SqlException é causada pela classe de modelo Movie atualizada ser diferente do esquema da tabela Movie do banco de dados. Não há nenhuma 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 usando o novo esquema de classe de modelo. Essa abordagem é conveniente no início do ciclo de desenvolvimento, permitindo que os desenvolvedores evoluam rapidamente o modelo e o esquema de banco de dados juntos. A desvantagem é que os dados existentes no banco de dados são perdidos. Não use essa abordagem em um banco de dados de produção! Descartar o banco de dados em alterações de esquema e usar um inicializador para semear automaticamente o banco de dados com dados de teste geralmente é uma maneira produtiva de desenvolver um aplicativo.
- Modifique explicitamente o esquema do banco de dados existente para que ele corresponda às classes de modelo. A vantagem desta abordagem é manter os dados. Faça essa alteração manualmente ou criando um script de alteração de banco de dados.
- Use EF Core Migrações para atualizar o esquema do banco de dados.
Para este tutorial, use EF Core Migrações.
Atualize a classe SeedData para que ela forneça um valor para a nova coluna. Um exemplo de alteração é mostrado abaixo, mas faça essa alteração para cada bloco new Movie.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Consulte o arquivo SeedData.cs concluído.
Crie o aplicativo
- Estúdio Visual
- de código do Visual Studio
Pressione Ctrl+Shift+B
- Estúdio Visual
- de código do Visual Studio
Adicionar uma migração para o campo de classificação
No menu Ferramentas, selecione Gestor de Pacotes NuGet > Consola do Gestor de Pacotes.
No Console do Gerenciador de Pacotes (PMC), digite o seguinte comando:
Add-Migration Rating
O comando Add-Migration diz ao framework para:
- Compare o modelo
Moviecom o esquema de banco de dadosMovie. - Crie código para migrar o esquema de 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.
No PMC, digite o seguinte comando:
Update-Database
O comando Update-Database instrui o framework a aplicar as alterações de esquema na base de dados e a preservar os dados existentes.
Exclua todos os registros no banco de dados, o inicializador semeará o banco de dados e incluirá o campo Rating. A eliminação pode ser feita através dos links de eliminação no navegador da web ou no Sql Server Object Explorer (SSOX).
Outra opção é excluir o banco de dados e usar migrações para recriar o banco de dados. Para excluir o banco de dados no SSOX:
Selecione o banco de dados em SSOX.
Clique com o botão direito do mouse no banco de dados e selecione Excluir.
Marcar Fechar conexões existentes.
Selecione OK.
No PMC, atualize o banco de dados:
Update-Database
Execute o aplicativo e verifique se você pode criar, editar e exibir filmes com um campo Rating. Se a base de dados não estiver inicializada, coloque um ponto de interrupção no método SeedData.Initialize.
Próximos passos
Nesta seção, Entity Framework Code First Migrations é usado para:
- Adicione um novo campo ao modelo.
- Migre a nova alteração de esquema de campo para o banco de dados.
Ao usar o EF Code First para criar e rastrear automaticamente um banco de dados, o Code First:
- Adiciona uma tabela
__EFMigrationsHistoryao banco de dados para controlar se o esquema do banco de dados está sincronizado com as classes de modelo a partir das quais foi gerado. - Lança uma exceção se as classes de modelo não estiverem sincronizadas com o banco de dados.
A verificação automática de que o esquema e o modelo estão sincronizados facilita a localização de problemas de código de banco de dados inconsistentes.
Adicionando uma propriedade de classificação ao modelo de filme
Abra o arquivo
Models/Movie.cse adicione uma propriedadeRating:public class Movie { public int Id { get; set; } public string Title { get; set; } = string.Empty; [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } = string.Empty; }Editar
Pages/Movies/Index.cshtmle adicionar um campoRating:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> <label>Title: <input type="text" asp-for="SearchString" /></label> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Rating) </td> <td> <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> | <a asp-page="./Details" asp-route-id="@item.Id">Details</a> | <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a> </td> </tr> } </tbody> </table>Atualize as seguintes páginas com um campo
Rating:
O aplicativo não funcionará até que o banco de dados seja atualizado para incluir o novo campo. A execução do aplicativo sem uma atualização para o banco de dados gera uma SqlException:
SqlException: Invalid column name 'Rating'.
A exceção SqlException é causada pela classe de modelo Movie atualizada ser diferente do esquema da tabela Movie do banco de dados. Não há nenhuma 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 usando o novo esquema de classe de modelo. Essa abordagem é conveniente no início do ciclo de desenvolvimento, permitindo que os desenvolvedores evoluam rapidamente o modelo e o esquema de banco de dados juntos. A desvantagem é que os dados existentes no banco de dados são perdidos. Não use essa abordagem em um banco de dados de produção! Descartar o banco de dados em alterações de esquema e usar um inicializador para semear automaticamente o banco de dados com dados de teste geralmente é uma maneira produtiva de desenvolver um aplicativo.
- Modifique explicitamente o esquema do banco de dados existente para que ele corresponda às classes de modelo. A vantagem desta abordagem é manter os dados. Faça 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, use Code First Migrations.
Atualize a classe SeedData para que ela forneça um valor para a nova coluna. Um exemplo de alteração é mostrado abaixo, mas faça essa alteração para cada bloco new Movie.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Consulte o arquivo SeedData.cs concluído.
Crie o aplicativo
- Estúdio Visual
- de código do Visual Studio
Pressione Ctrl+Shift+B
- Estúdio Visual
- de código do Visual Studio
Adicionar uma migração para o campo de classificação
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 comando Add-Migration diz ao framework para:
- Compare o modelo
Moviecom o esquema de banco de dadosMovie. - Crie código para migrar o esquema de 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.
O comando Update-Database instrui o framework a aplicar as alterações de esquema na base de dados e a preservar os dados existentes.
Exclua todos os registros no banco de dados, o inicializador semeará o banco de dados e incluirá o campo Rating. A eliminação pode ser feita através dos links de eliminação no navegador da web ou no Sql Server Object Explorer (SSOX).
Outra opção é excluir o banco de dados e usar migrações para recriar o banco de dados. Para excluir o banco de dados no SSOX:
Selecione o banco de dados em SSOX.
Clique com o botão direito do mouse no banco de dados e selecione Excluir.
Marcar Fechar conexões existentes.
Selecione OK.
No PMC, atualize o banco de dados:
Update-Database
Execute o aplicativo e verifique se você pode criar, editar e exibir filmes com um campo Rating. Se a base de dados não estiver inicializada, coloque um ponto de interrupção no método SeedData.Initialize.
Próximos passos
Nesta seção, Entity Framework Code First Migrations é usado para:
- Adicione um novo campo ao modelo.
- Migre a nova alteração de esquema de campo para o banco de dados.
Ao usar o EF Code First para criar e rastrear automaticamente um banco de dados, o Code First:
- Adiciona uma tabela
__EFMigrationsHistoryao banco de dados para controlar se o esquema do banco de dados está sincronizado com as classes de modelo a partir das quais foi gerado. - Lança uma exceção se as classes de modelo não estiverem sincronizadas com o banco de dados.
A verificação automática de que o esquema e o modelo estão sincronizados facilita a localização de problemas de código de banco de dados inconsistentes.
Adicionando uma propriedade de classificação ao modelo de filme
Abra o arquivo
Models/Movie.cse adicione uma propriedadeRating:public class Movie { public int Id { get; set; } public string Title { get; set; } = string.Empty; [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } = string.Empty; }Editar
Pages/Movies/Index.cshtmle adicionar um campoRating:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> <label>Title: <input type="text" asp-for="SearchString" /></label> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Rating) </td> <td> <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> | <a asp-page="./Details" asp-route-id="@item.Id">Details</a> | <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a> </td> </tr> } </tbody> </table>Atualize as seguintes páginas com um campo
Rating:
O aplicativo não funcionará até que o banco de dados seja atualizado para incluir o novo campo. A execução do aplicativo sem uma atualização para o banco de dados gera uma SqlException:
SqlException: Invalid column name 'Rating'.
A exceção SqlException é causada pela classe de modelo Movie atualizada ser diferente do esquema da tabela Movie do banco de dados. Não há nenhuma 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 usando o novo esquema de classe de modelo. Essa abordagem é conveniente no início do ciclo de desenvolvimento, permitindo que os desenvolvedores evoluam rapidamente o modelo e o esquema de banco de dados juntos. A desvantagem é que os dados existentes no banco de dados são perdidos. Não use essa abordagem em um banco de dados de produção! Descartar o banco de dados em alterações de esquema e usar um inicializador para semear automaticamente o banco de dados com dados de teste geralmente é uma maneira produtiva de desenvolver um aplicativo.
- Modifique explicitamente o esquema do banco de dados existente para que ele corresponda às classes de modelo. A vantagem desta abordagem é manter os dados. Faça 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, use Code First Migrations.
Atualize a classe SeedData para que ela forneça um valor para a nova coluna. Um exemplo de alteração é mostrado abaixo, mas faça essa alteração para cada bloco new Movie.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Consulte o arquivo SeedData.cs concluído.
Crie o aplicativo
- Estúdio Visual
- de código do Visual Studio
- Visual Studio para Mac
Pressione Ctrl+Shift+B
Adicionar uma migração para o campo de classificação
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 comando Add-Migration diz ao framework para:
- Compare o modelo
Moviecom o esquema de banco de dadosMovie. - Crie código para migrar o esquema de 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.
O comando Update-Database instrui o framework a aplicar as alterações de esquema na base de dados e a preservar os dados existentes.
Exclua todos os registros no banco de dados, o inicializador semeará o banco de dados e incluirá o campo Rating. A eliminação pode ser feita através dos links de eliminação no navegador da web ou no Sql Server Object Explorer (SSOX).
Outra opção é excluir o banco de dados e usar migrações para recriar o banco de dados. Para excluir o banco de dados no SSOX:
Selecione o banco de dados em SSOX.
Clique com o botão direito do mouse no banco de dados e selecione Excluir.
Marcar Fechar conexões existentes.
Selecione OK.
No PMC, atualize o banco de dados:
Update-Database
Execute o aplicativo e verifique se você pode criar, editar e exibir filmes com um campo Rating. Se a base de dados não estiver inicializada, coloque um ponto de interrupção no método SeedData.Initialize.
Próximos passos
Nesta seção, Entity Framework Code First Migrations é usado para:
- Adicione um novo campo ao modelo.
- Migre a nova alteração de esquema de campo para o banco de dados.
Ao usar o EF Code First para criar e rastrear automaticamente um banco de dados, o Code First:
- Adiciona uma tabela
__EFMigrationsHistoryao banco de dados para controlar se o esquema do banco de dados está sincronizado com as classes de modelo a partir das quais foi gerado. - Lança uma exceção se as classes de modelo não estiverem sincronizadas com o banco de dados.
A verificação automática de que o esquema e o modelo estão sincronizados facilita a localização de problemas de código de banco de dados inconsistentes.
Adicionando uma propriedade de classificação ao modelo de filme
Abra o arquivo
Models/Movie.cse adicione uma propriedadeRating:public class Movie { public int ID { get; set; } public string Title { get; set; } = string.Empty; [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } = string.Empty; }Editar
Pages/Movies/Index.cshtmle adicionar um campoRating:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> <label>Title: <input type="text" asp-for="SearchString" /></label> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Rating) </td> <td> <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> | <a asp-page="./Details" asp-route-id="@item.ID">Details</a> | <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a> </td> </tr> } </tbody> </table>Atualize as seguintes páginas com um campo
Rating:
O aplicativo não funcionará até que o banco de dados seja atualizado para incluir o novo campo. A execução do aplicativo sem uma atualização para o banco de dados gera uma SqlException:
SqlException: Invalid column name 'Rating'.
A exceção SqlException é causada pela classe de modelo Movie atualizada ser diferente do esquema da tabela Movie do banco de dados. Não há nenhuma 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 usando o novo esquema de classe de modelo. Essa abordagem é conveniente no início do ciclo de desenvolvimento, permitindo que os desenvolvedores evoluam rapidamente o modelo e o esquema de banco de dados juntos. A desvantagem é que os dados existentes no banco de dados são perdidos. Não use essa abordagem em um banco de dados de produção! Descartar o banco de dados em alterações de esquema e usar um inicializador para semear automaticamente o banco de dados com dados de teste geralmente é uma maneira produtiva de desenvolver um aplicativo.
- Modifique explicitamente o esquema do banco de dados existente para que ele corresponda às classes de modelo. A vantagem desta abordagem é manter os dados. Faça 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, use Code First Migrations.
Atualize a classe SeedData para que ela forneça um valor para a nova coluna. Um exemplo de alteração é mostrado abaixo, mas faça essa alteração para cada bloco new Movie.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Consulte o arquivo SeedData.cs concluído.
Crie a solução.
- Estúdio Visual
- de código do Visual Studio
Adicionar uma migração para o campo de classificação
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 comando Add-Migration diz ao framework para:
- Compare o modelo
Moviecom o esquema de banco de dadosMovie. - Crie código para migrar o esquema de 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.
O comando Update-Database instrui o framework a aplicar as alterações de esquema na base de dados e a preservar os dados existentes.
Exclua todos os registros no banco de dados, o inicializador semeará o banco de dados e incluirá o campo Rating. A eliminação pode ser feita através dos links de eliminação no navegador da web ou no Sql Server Object Explorer (SSOX).
Outra opção é excluir o banco de dados e usar migrações para recriar o banco de dados. Para excluir o banco de dados no SSOX:
Selecione o banco de dados em SSOX.
Clique com o botão direito do mouse no banco de dados e selecione Excluir.
Marcar Fechar conexões existentes.
Selecione OK.
No PMC, atualize o banco de dados:
Update-Database
Execute o aplicativo e verifique se você pode criar, editar e exibir filmes com um campo Rating. Se a base de dados não estiver inicializada, coloque um ponto de interrupção no método SeedData.Initialize.
Próximos passos
Ver ou descarregar código de exemplo (como descarregar).
Nesta seção, Entity Framework Code First Migrations é usado para:
- Adicione um novo campo ao modelo.
- Migre a nova alteração de esquema de campo para o banco de dados.
Ao usar o EF Code First para criar automaticamente um banco de dados, o Code First:
- Adiciona uma tabela
__EFMigrationsHistoryao banco de dados para controlar se o esquema do banco de dados está sincronizado com as classes de modelo a partir das quais foi gerado. - Se as classes de modelo não estiverem sincronizadas com o banco de dados, o EF lançará uma exceção.
A verificação automática de que o esquema e o modelo estão sincronizados facilita a localização de problemas de código de banco de dados inconsistentes.
Adicionando uma propriedade de classificação ao modelo de filme
Abra o arquivo
Models/Movie.cse adicione uma propriedadeRating: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.
Edite
Pages/Movies/Index.cshtmle adicione um campoRating:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> <label>Title: <input type="text" asp-for="SearchString" /></label> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Rating) </td> <td> <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> | <a asp-page="./Details" asp-route-id="@item.ID">Details</a> | <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a> </td> </tr> } </tbody> </table>Atualize as seguintes páginas com um campo
Rating:
O aplicativo não funcionará até que o banco de dados seja atualizado para incluir o novo campo. A execução do aplicativo sem uma atualização para o banco de dados gera uma SqlException:
SqlException: Invalid column name 'Rating'.
A exceção SqlException é causada pela classe de modelo Movie atualizada ser diferente do esquema da tabela Movie do banco de dados. Não há nenhuma 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 usando o novo esquema de classe de modelo. Essa abordagem é conveniente no início do ciclo de desenvolvimento, pois permite que você evolua rapidamente o modelo e o esquema de banco de dados juntos. A desvantagem é que você perde dados existentes no banco de dados. Não use essa abordagem em um banco de dados de produção! Descartar o banco de dados em alterações de esquema e usar um inicializador para semear automaticamente o banco de dados com dados de teste geralmente é uma maneira produtiva de desenvolver um aplicativo.
Modifique explicitamente o esquema do banco de dados existente para que ele corresponda às classes de modelo. A vantagem desta abordagem é manter os dados. Faça 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, use Code First Migrations.
Atualize a classe SeedData para que ela forneça um valor para a nova coluna. Um exemplo de alteração é mostrado abaixo, mas faça essa alteração para cada bloco new Movie.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Consulte o arquivo SeedData.cs concluído.
Crie a solução.
- Estúdio Visual
- de código do Visual Studio
Adicionar uma migração para o campo de classificação
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 comando Add-Migration diz ao framework para:
- Compare o modelo
Moviecom o esquema de banco de dadosMovie. - Crie código para migrar o esquema de 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.
O comando Update-Database instrui o framework a aplicar as alterações de esquema na base de dados e a preservar os dados existentes.
Exclua todos os registros no banco de dados, o inicializador semeará o banco de dados e incluirá o campo Rating. A eliminação pode ser feita através dos links de eliminação no navegador da web ou no Sql Server Object Explorer (SSOX).
Outra opção é excluir o banco de dados e usar migrações para recriar o banco de dados. Para excluir o banco de dados no SSOX:
Selecione o banco de dados em SSOX.
Clique com o botão direito do mouse no banco de dados e selecione Excluir.
Marcar Fechar conexões existentes.
Selecione OK.
No PMC, atualize o banco de dados:
Update-Database
Execute o aplicativo e verifique se você pode criar/editar/exibir filmes com um campo Rating. Se a base de dados não estiver inicializada, coloque um ponto de interrupção no método SeedData.Initialize.
Próximos passos
Ver ou descarregar código de exemplo (como descarregar).
Nesta seção, Entity Framework Code First Migrations é usado para:
- Adicione um novo campo ao modelo.
- Migre a nova alteração de esquema de campo para o banco de dados.
Ao usar o EF Code First para criar automaticamente um banco de dados, o Code First:
- Adiciona uma tabela
__EFMigrationsHistoryao banco de dados para controlar se o esquema do banco de dados está sincronizado com as classes de modelo a partir das quais foi gerado. - Se as classes de modelo não estiverem sincronizadas com o banco de dados, o EF lançará uma exceção.
A verificação automática de que o esquema e o modelo estão sincronizados facilita a localização de problemas de código de banco de dados inconsistentes.
Adicionando uma propriedade de classificação ao modelo de filme
Abra o arquivo
Models/Movie.cse adicione uma propriedadeRating: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.
Edite
Pages/Movies/Index.cshtmle adicione um campoRating:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> <label>Title: <input type="text" asp-for="SearchString" /></label> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Rating) </td> <td> <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> | <a asp-page="./Details" asp-route-id="@item.ID">Details</a> | <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a> </td> </tr> } </tbody> </table>Atualize as seguintes páginas com um campo
Rating:
O aplicativo não funcionará até que o banco de dados seja atualizado para incluir o novo campo. A execução do aplicativo sem uma atualização para o banco de dados gera uma SqlException:
SqlException: Invalid column name 'Rating'.
A exceção SqlException é causada pela classe de modelo Movie atualizada ser diferente do esquema da tabela Movie do banco de dados. Não há nenhuma 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 usando o novo esquema de classe de modelo. Essa abordagem é conveniente no início do ciclo de desenvolvimento, pois permite que você evolua rapidamente o modelo e o esquema de banco de dados juntos. A desvantagem é que você perde dados existentes no banco de dados. Não use essa abordagem em um banco de dados de produção! Descartar o banco de dados em alterações de esquema e usar um inicializador para semear automaticamente o banco de dados com dados de teste geralmente é uma maneira produtiva de desenvolver um aplicativo.
Modifique explicitamente o esquema do banco de dados existente para que ele corresponda às classes de modelo. A vantagem desta abordagem é manter os dados. Faça 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, use Code First Migrations.
Atualize a classe SeedData para que ela forneça um valor para a nova coluna. Um exemplo de alteração é mostrado abaixo, mas faça essa alteração para cada bloco new Movie.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Consulte o arquivo SeedData.cs concluído.
Crie a solução.
- Estúdio Visual
- de código do Visual Studio
Adicionar uma migração para o campo de classificação
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 comando Add-Migration diz ao framework para:
- Compare o modelo
Moviecom o esquema de banco de dadosMovie. - Crie código para migrar o esquema de 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.
O comando Update-Database instrui o framework a aplicar as alterações de esquema na base de dados e a preservar os dados existentes.
Se você excluir todos os registros no banco de dados, o inicializador semeará o banco de dados e incluirá o campo Rating. Você pode fazer isso através das ligações para eliminar no navegador ou a partir do Sql Server Object Explorer (SSOX).
Outra opção é excluir o banco de dados e usar migrações para recriar o banco de dados. Para excluir o banco de dados no SSOX:
Selecione o banco de dados em SSOX.
Clique com o botão direito do mouse no banco de dados e selecione Excluir.
Marcar Fechar conexões existentes.
Selecione OK.
No PMC, atualize o banco de dados:
Update-Database
Execute o aplicativo e verifique se você pode criar/editar/exibir filmes com um campo Rating. Se a base de dados não estiver inicializada, coloque um ponto de interrupção no método SeedData.Initialize.