Parte 2, adicionar um modelo a um aplicativo Razor Pages no ASP.NET Core
Observação
Esta não é a versão mais recente deste artigo. Para informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.
Aviso
Esta versão do ASP.NET Core não tem mais suporte. Para obter mais informações, confira .NET e a Política de Suporte do .NET Core. Para informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.
Importante
Essas informações relacionam-se ao produto de pré-lançamento, que poderá ser substancialmente modificado antes do lançamento comercial. A Microsoft não oferece nenhuma garantia, explícita ou implícita, quanto às informações fornecidas aqui.
Para informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.
Neste tutorial, classes são adicionadas para o gerenciamento de filmes em um banco de dados. As classes de modelo do aplicativo usam o Entity Framework Core (EF Core) para trabalhar com o banco de dados. EF Core é um O/RM (mapeador relacional de objetos) que simplifica o acesso a dados. Você escreve as classes de modelo primeiro e o EF Core cria o banco de dados.
As classes de modelo são conhecidas como classes POCO (de "Objetos CLR Básicos") porque não têm dependência do EF Core. Elas definem as propriedades dos dados que são armazenados no banco de dados.
Adicionar um modelo de dados
No Gerenciador de soluções, clique com o botão direito do mouse no projeto RazorPagesMovie>Adicionar>Nova Pasta. Nomeie a pasta
Models
.Clique com o botão direito do mouse na pasta
Models
. Selecione Adicionar>Classe. Dê à classe o nome Movie.Adicione as seguintes propriedades à classe
Movie
:using System.ComponentModel.DataAnnotations; namespace RazorPagesMovie.Models; public class Movie { public int Id { get; set; } public string? Title { get; set; } [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string? Genre { get; set; } public decimal Price { get; set; } }
A classe Movie
contém:
O campo
ID
é necessário para o banco de dados para a chave primária.Um atributo [DataType] que especifica o tipo de dados na propriedade
ReleaseDate
. Com esse atributo:- O usuário não precisa inserir informações de horário no campo de data.
- Somente a data é exibida, não as informações de tempo.
O ponto de interrogação após
string
indica que a propriedade permite valor nulo. Para obter mais informações, confira Tipos de referência anuláveis.
DataAnnotations são abordados em um tutorial posterior.
Crie o projeto para verificar se não há erros de compilação.
Fazer scaffold do modelo de filme
Nesta seção, é feito o scaffold do modelo de filme. Ou seja, a ferramenta de scaffolding gera páginas para operações de CRUD (Criar, Ler, Atualizar e Excluir) para o modelo do filme.
Crie a pasta Pages/Movies:
- Clique com o botão direito do mouse na pasta Pages >Adicionar>Nova Pasta.
- Dê à pasta o nome Movies.
Clique com o botão direito do mouse na pasta Pages/Movies >Adicionar>Novo item com scaffold.
No diálogo Adicionar Scaffold, selecione Razor Pages usando o Entity Framework (CRUD)>Adicionar.
Conclua a caixa de diálogo Adicionar Razor Pages usando o Entity Framework (CRUD):
- Na lista suspensa Classe de modelo, selecione Filme (RazorPagesMovie.Models).
- Na linha Classe de contexto de dados, selecione o sinal + (adição).
- Na caixa de diálogo Adicionar contexto de dados, o nome da classe
RazorPagesMovie.Data.RazorPagesMovieContext
é gerado. - Na lista suspensa Provedor de banco de dados, selecione SQL Server.
- Na caixa de diálogo Adicionar contexto de dados, o nome da classe
- Selecione Adicionar.
O arquivo appsettings.json
é atualizado com a cadeia de conexão usada para se conectar a um banco de dados local.
Aviso
Este artigo usa um banco de dados local que não exige que o usuário seja autenticado. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos de teste e produção implantados, consulte Fluxos de autenticação seguros.
Arquivos criados e atualizados
O processo de scaffold cria os arquivos a seguir:
- Pages/Movies: Create, Delete, Details, Edit e Index.
Data/RazorPagesMovieContext.cs
Os arquivos criados são explicados no próximo tutorial.
O processo de scaffold adiciona o seguinte código realçado ao arquivo Program.cs
:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
app.MapRazorPages();
app.Run();
As alterações Program.cs
são explicadas posteriormente neste tutorial.
Criar o esquema de banco de dados inicial usando o recurso de migração do EF
O recurso de migrações no Entity Framework Core fornece uma maneira de:
- Crie o esquema inicial do banco de dados.
- Atualize incrementalmente o esquema de banco de dados para mantê-lo em sincronia com o modelo de dados do aplicativo. Os dados existentes no banco de dados são preservados.
Nesta seção, a janela do PMC (Console de Gerenciador de Pacotes) é usada para:
Adicione uma migração inicial.
Atualize o banco de dados com a migração inicial.
No menu Ferramentas, selecione Gerenciador de Pacotes NuGet>Console do Gerenciador de Pacotes.
No PMC, insira o seguinte comando:
Add-Migration InitialCreate
O comando
Add-Migration
gera código para criar o esquema de banco de dados inicial. O esquema é baseado no modelo especificado emDbContext
. O argumentoInitialCreate
é usado para nomear a migração. Qualquer nome pode ser usado, mas, por convenção, um nome que descreve a migração é selecionado.
O seguinte aviso é exibido, que é abordado em uma etapa posterior:
Nenhum tipo foi especificado para a coluna decimal 'Preço' no tipo de entidade 'Filme'. Isso fará com que valores sejam truncados silenciosamente se não couberem na precisão e na escala padrão. Especifique explicitamente o tipo de coluna do SQL Server que pode acomodar todos os valores usando 'HasColumnType()'.
No PMC, insira o seguinte comando:
Update-Database
O comando
Update-Database
executa o métodoUp
em migrações que não foram aplicadas. Nesse caso, o comando executa o métodoUp
no arquivoMigrations/<time-stamp>_InitialCreate.cs
, que cria o banco de dados.
O contexto de dados RazorPagesMovieContext
:
- Deriva de Microsoft.EntityFrameworkCore.DbContext.
- Especifica quais entidades são incluídas no modelo de dados.
- Coordena a funcionalidade EF Core, como Criar, Ler, Atualizar e Excluir, para o modelo
Movie
.
A classe RazorPagesMovieContext
no arquivo gerado Data/RazorPagesMovieContext.cs
:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
}
}
O código anterior cria uma propriedade DbSet<Movie> para o conjunto de entidades. Na terminologia do Entity Framework, um conjunto de entidades normalmente corresponde a uma tabela de banco de dados. Uma entidade corresponde a uma linha da tabela.
O nome da cadeia de conexão é passado para o contexto com a chamada de um método em um objeto DbContextOptions. Para o desenvolvimento local, o Sistema de configuração lê a cadeia de conexão do arquivo appsettings.json
.
Testar o aplicativo
Executar o aplicativo e acrescentar
/Movies
à URL no navegador (http://localhost:port/movies
).Você receberá a seguinte mensagem de erro:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed. Login failed for user 'User-name'.
Você perdeu a etapa de migrações.
Teste o link Criar.
Observação
Talvez você não consiga inserir casas decimais ou vírgulas no campo
Price
. Para dar suporte à validação do jQuery para localidades com idiomas diferentes do inglês que usam uma vírgula (",") para um ponto decimal e formatos de data diferentes do inglês dos EUA, o aplicativo precisa ser globalizado. Para obter instruções sobre a globalização, consulte esse problema no GitHub.Teste os links Editar, Detalhes e Excluir.
O tutorial a seguir explica os arquivos criados por scaffolding.
Examinar o contexto registrado com a injeção de dependência
O ASP.NET Core é construído com a injeção de dependência. Serviços, como o contexto de banco de dados do EF Core, são registrados com injeção de dependência durante a inicialização do aplicativo. Os componentes que exigem esses serviços (por exemplo, o Razor Pages) são fornecidos por meio dos parâmetros do construtor. O código de construtor que obtém uma instância de contexto do banco de dados é mostrado mais adiante no tutorial.
A ferramenta de scaffolding criou automaticamente um contexto de banco de dados e o registrou no contêiner da injeção de dependência. O código realçado a seguir é adicionado ao arquivo Program.cs
pelo scaffolder:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
app.MapRazorPages();
app.Run();
Solução de problemas com o exemplo concluído
Se você encontrar um problema que não possa resolver, compare seu código com o projeto concluído. Exibir ou baixar projeto concluído (como baixar).
Próximas etapas
Neste tutorial, classes são adicionadas para o gerenciamento de filmes em um banco de dados. As classes de modelo do aplicativo usam o Entity Framework Core (EF Core) para trabalhar com o banco de dados. EF Core é um O/RM (mapeador relacional de objetos) que simplifica o acesso a dados. Você escreve as classes de modelo primeiro e o EF Core cria o banco de dados.
As classes de modelo são conhecidas como classes POCO (de "Objetos CLR Básicos") porque não têm dependência do EF Core. Elas definem as propriedades dos dados que são armazenados no banco de dados.
Adicionar um modelo de dados
No Gerenciador de soluções, clique com o botão direito do mouse no projeto RazorPagesMovie>Adicionar>Nova Pasta. Nomeie a pasta
Models
.Clique com o botão direito do mouse na pasta
Models
. Selecione Adicionar>Classe. Dê à classe o nome Movie.Adicione as seguintes propriedades à classe
Movie
:using System.ComponentModel.DataAnnotations; namespace RazorPagesMovie.Models; public class Movie { public int Id { get; set; } public string? Title { get; set; } [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string? Genre { get; set; } public decimal Price { get; set; } }
A classe Movie
contém:
O campo
ID
é necessário para o banco de dados para a chave primária.Um atributo [DataType] que especifica o tipo de dados na propriedade
ReleaseDate
. Com esse atributo:- O usuário não precisa inserir informações de horário no campo de data.
- Somente a data é exibida, não as informações de tempo.
O ponto de interrogação após
string
indica que a propriedade permite valor nulo. Para obter mais informações, confira Tipos de referência anuláveis.
DataAnnotations são abordados em um tutorial posterior.
Crie o projeto para verificar se não há erros de compilação.
Fazer scaffold do modelo de filme
Nesta seção, é feito o scaffold do modelo de filme. Ou seja, a ferramenta de scaffolding gera páginas para operações de CRUD (Criar, Ler, Atualizar e Excluir) para o modelo do filme.
Crie a pasta Pages/Movies:
- Clique com o botão direito do mouse na pasta Pages >Adicionar>Nova Pasta.
- Dê à pasta o nome Movies.
Clique com o botão direito do mouse na pasta Pages/Movies >Adicionar>Novo item com scaffold.
No diálogo Adicionar Scaffold, selecione Razor Pages usando o Entity Framework (CRUD)>Adicionar.
Conclua a caixa de diálogo Adicionar Razor Pages usando o Entity Framework (CRUD):
- Na lista suspensa Classe de modelo, selecione Filme (RazorPagesMovie.Models).
- Na linha Classe de contexto de dados, selecione o sinal + (adição).
- Na caixa de diálogo Adicionar contexto de dados, o nome da classe
RazorPagesMovie.Data.RazorPagesMovieContext
é gerado. - Na lista suspensa Provedor de banco de dados, selecione SQL Server.
- Na caixa de diálogo Adicionar contexto de dados, o nome da classe
- Selecione Adicionar.
O arquivo appsettings.json
é atualizado com a cadeia de conexão usada para se conectar a um banco de dados local.
Aviso
Este artigo usa um banco de dados local que não exige que o usuário seja autenticado. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos de teste e produção implantados, consulte Fluxos de autenticação seguros.
Arquivos criados e atualizados
O processo de scaffold cria os arquivos a seguir:
- Pages/Movies: Create, Delete, Details, Edit e Index.
Data/RazorPagesMovieContext.cs
Os arquivos criados são explicados no próximo tutorial.
O processo de scaffold adiciona o seguinte código realçado ao arquivo Program.cs
:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
As alterações Program.cs
são explicadas posteriormente neste tutorial.
Criar o esquema de banco de dados inicial usando o recurso de migração do EF
O recurso de migrações no Entity Framework Core fornece uma maneira de:
- Crie o esquema inicial do banco de dados.
- Atualize incrementalmente o esquema de banco de dados para mantê-lo em sincronia com o modelo de dados do aplicativo. Os dados existentes no banco de dados são preservados.
Nesta seção, a janela do PMC (Console de Gerenciador de Pacotes) é usada para:
Adicione uma migração inicial.
Atualize o banco de dados com a migração inicial.
No menu Ferramentas, selecione Gerenciador de Pacotes NuGet>Console do Gerenciador de Pacotes.
No PMC, insira o seguinte comando:
Add-Migration InitialCreate
O comando
Add-Migration
gera código para criar o esquema de banco de dados inicial. O esquema é baseado no modelo especificado emDbContext
. O argumentoInitialCreate
é usado para nomear a migração. Qualquer nome pode ser usado, mas, por convenção, um nome que descreve a migração é selecionado.
O seguinte aviso é exibido, que é abordado em uma etapa posterior:
Nenhum tipo foi especificado para a coluna decimal 'Preço' no tipo de entidade 'Filme'. Isso fará com que valores sejam truncados silenciosamente se não couberem na precisão e na escala padrão. Especifique explicitamente o tipo de coluna do SQL Server que pode acomodar todos os valores usando 'HasColumnType()'.
No PMC, insira o seguinte comando:
Update-Database
O comando
Update-Database
executa o métodoUp
em migrações que não foram aplicadas. Nesse caso, o comando executa o métodoUp
no arquivoMigrations/<time-stamp>_InitialCreate.cs
, que cria o banco de dados.
O contexto de dados RazorPagesMovieContext
:
- Deriva de Microsoft.EntityFrameworkCore.DbContext.
- Especifica quais entidades são incluídas no modelo de dados.
- Coordena a funcionalidade EF Core, como Criar, Ler, Atualizar e Excluir, para o modelo
Movie
.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
}
}
O código anterior cria uma propriedade DbSet<Movie> para o conjunto de entidades. Na terminologia do Entity Framework, um conjunto de entidades normalmente corresponde a uma tabela de banco de dados. Uma entidade corresponde a uma linha da tabela.
O nome da cadeia de conexão é passado para o contexto com a chamada de um método em um objeto DbContextOptions. Para o desenvolvimento local, o Sistema de configuração lê a cadeia de conexão do arquivo appsettings.json
.
Testar o aplicativo
Executar o aplicativo e acrescentar
/Movies
à URL no navegador (http://localhost:port/movies
).Você receberá a seguinte mensagem de erro:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed. Login failed for user 'User-name'.
Você perdeu a etapa de migrações.
Teste o link Criar.
Observação
Talvez você não consiga inserir casas decimais ou vírgulas no campo
Price
. Para dar suporte à validação do jQuery para localidades com idiomas diferentes do inglês que usam uma vírgula (",") para um ponto decimal e formatos de data diferentes do inglês dos EUA, o aplicativo precisa ser globalizado. Para obter instruções sobre a globalização, consulte esse problema no GitHub.Teste os links Editar, Detalhes e Excluir.
O tutorial a seguir explica os arquivos criados por scaffolding.
Examinar o contexto registrado com a injeção de dependência
O ASP.NET Core é construído com a injeção de dependência. Serviços, como o contexto de banco de dados do EF Core, são registrados com injeção de dependência durante a inicialização do aplicativo. Os componentes que exigem esses serviços (por exemplo, o Razor Pages) são fornecidos por meio dos parâmetros do construtor. O código de construtor que obtém uma instância de contexto do banco de dados é mostrado mais adiante no tutorial.
A ferramenta de scaffolding criou automaticamente um contexto de banco de dados e o registrou no contêiner da injeção de dependência. O código realçado a seguir é adicionado ao arquivo Program.cs
pelo scaffolder:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Solução de problemas com o exemplo concluído
Se você encontrar um problema que não possa resolver, compare seu código com o projeto concluído. Exibir ou baixar projeto concluído (como baixar).
Próximas etapas
Neste tutorial, classes são adicionadas para o gerenciamento de filmes em um banco de dados. As classes de modelo do aplicativo usam o Entity Framework Core (EF Core) para trabalhar com o banco de dados. EF Core é um O/RM (mapeador relacional de objetos) que simplifica o acesso a dados. Você escreve as classes de modelo primeiro e o EF Core cria o banco de dados.
As classes de modelo são conhecidas como classes POCO (de "Objetos CLR Básicos") porque não têm dependência do EF Core. Elas definem as propriedades dos dados que são armazenados no banco de dados.
Adicionar um modelo de dados
No Gerenciador de soluções, clique com o botão direito do mouse no projeto RazorPagesMovie>Adicionar>Nova Pasta. Nomeie a pasta
Models
.Clique com o botão direito do mouse na pasta
Models
. Selecione Adicionar>Classe. Dê à classe o nome Movie.Adicione as seguintes propriedades à classe
Movie
:using System.ComponentModel.DataAnnotations; namespace RazorPagesMovie.Models; public class Movie { public int Id { get; set; } public string? Title { get; set; } [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string? Genre { get; set; } public decimal Price { get; set; } }
A classe Movie
contém:
O campo
ID
é necessário para o banco de dados para a chave primária.Um atributo [DataType] que especifica o tipo de dados na propriedade
ReleaseDate
. Com esse atributo:- O usuário não precisa inserir informações de horário no campo de data.
- Somente a data é exibida, não as informações de tempo.
O ponto de interrogação após
string
indica que a propriedade permite valor nulo. Para obter mais informações, confira Tipos de referência anuláveis.
DataAnnotations são abordados em um tutorial posterior.
Crie o projeto para verificar se não há erros de compilação.
Fazer scaffold do modelo de filme
Nesta seção, é feito o scaffold do modelo de filme. Ou seja, a ferramenta de scaffolding gera páginas para operações de CRUD (Criar, Ler, Atualizar e Excluir) para o modelo do filme.
Crie a pasta Pages/Movies:
- Clique com o botão direito do mouse na pasta Pages >Adicionar>Nova Pasta.
- Dê à pasta o nome Movies.
Clique com o botão direito do mouse na pasta Pages/Movies >Adicionar>Novo item com scaffold.
No diálogo Adicionar Scaffold, selecione Razor Pages usando o Entity Framework (CRUD)>Adicionar.
Conclua a caixa de diálogo Adicionar Razor Pages usando o Entity Framework (CRUD):
- Na lista suspensa Classe de modelo, selecione Filme (RazorPagesMovie.Models).
- Na linha Classe de contexto de dados, selecione o sinal + (adição).
- Na caixa de diálogo Adicionar contexto de dados, o nome da classe
RazorPagesMovie.Data.RazorPagesMovieContext
é gerado. - Na lista suspensa Provedor de banco de dados, selecione SQL Server.
- Na caixa de diálogo Adicionar contexto de dados, o nome da classe
- Selecione Adicionar.
O arquivo appsettings.json
é atualizado com a cadeia de conexão usada para se conectar a um banco de dados local.
Aviso
Este artigo usa um banco de dados local que não exige que o usuário seja autenticado. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos de teste e produção implantados, consulte Fluxos de autenticação seguros.
Arquivos criados e atualizados
O processo de scaffold cria os arquivos a seguir:
- Pages/Movies: Create, Delete, Details, Edit e Index.
Data/RazorPagesMovieContext.cs
Os arquivos criados são explicados no próximo tutorial.
O processo de scaffold adiciona o seguinte código realçado ao arquivo Program.cs
:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
As alterações Program.cs
são explicadas posteriormente neste tutorial.
Criar o esquema de banco de dados inicial usando o recurso de migração do EF
O recurso de migrações no Entity Framework Core fornece uma maneira de:
- Crie o esquema inicial do banco de dados.
- Atualize incrementalmente o esquema de banco de dados para mantê-lo em sincronia com o modelo de dados do aplicativo. Os dados existentes no banco de dados são preservados.
Nesta seção, a janela do PMC (Console de Gerenciador de Pacotes) é usada para:
- Adicione uma migração inicial.
- Atualize o banco de dados com a migração inicial.
No menu Ferramentas, selecione Gerenciador de Pacotes NuGet>Console do Gerenciador de Pacotes.
No PMC, insira os seguintes comandos:
Add-Migration InitialCreate Update-Database
O comando
Add-Migration
gera código para criar o esquema de banco de dados inicial. O esquema é baseado no modelo especificado emDbContext
. O argumentoInitialCreate
é usado para nomear a migração. Qualquer nome pode ser usado, mas, por convenção, um nome que descreve a migração é selecionado.O comando
Update-Database
executa o métodoUp
em migrações que não foram aplicadas. Nesse caso, o comando executa o métodoUp
no arquivoMigrations/<time-stamp>_InitialCreate.cs
, que cria o banco de dados.
O seguinte aviso é exibido, que é abordado em uma etapa posterior:
Nenhum tipo foi especificado para a coluna decimal 'Preço' no tipo de entidade 'Filme'. Isso fará com que valores sejam truncados silenciosamente se não couberem na precisão e na escala padrão. Especifique explicitamente o tipo de coluna do SQL Server que pode acomodar todos os valores usando 'HasColumnType()'.
O contexto de dados RazorPagesMovieContext
:
- Deriva de Microsoft.EntityFrameworkCore.DbContext.
- Especifica quais entidades são incluídas no modelo de dados.
- Coordena a funcionalidade EF Core, como Criar, Ler, Atualizar e Excluir, para o modelo
Movie
.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
}
}
O código anterior cria uma propriedade DbSet<Movie> para o conjunto de entidades. Na terminologia do Entity Framework, um conjunto de entidades normalmente corresponde a uma tabela de banco de dados. Uma entidade corresponde a uma linha da tabela.
O nome da cadeia de conexão é passado para o contexto com a chamada de um método em um objeto DbContextOptions. Para o desenvolvimento local, o Sistema de configuração lê a cadeia de conexão do arquivo appsettings.json
.
Testar o aplicativo
Executar o aplicativo e acrescentar
/Movies
à URL no navegador (http://localhost:port/movies
).Você receberá a seguinte mensagem de erro:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed. Login failed for user 'User-name'.
Você perdeu a etapa de migrações.
Teste o link Criar.
Observação
Talvez você não consiga inserir casas decimais ou vírgulas no campo
Price
. Para dar suporte à validação do jQuery para localidades com idiomas diferentes do inglês que usam uma vírgula (",") para um ponto decimal e formatos de data diferentes do inglês dos EUA, o aplicativo precisa ser globalizado. Para obter instruções sobre a globalização, consulte esse problema no GitHub.Teste os links Editar, Detalhes e Excluir.
O tutorial a seguir explica os arquivos criados por scaffolding.
Examinar o contexto registrado com a injeção de dependência
O ASP.NET Core é construído com a injeção de dependência. Serviços, como o contexto de banco de dados do EF Core, são registrados com injeção de dependência durante a inicialização do aplicativo. Os componentes que exigem esses serviços (por exemplo, o Razor Pages) são fornecidos por meio dos parâmetros do construtor. O código de construtor que obtém uma instância de contexto do banco de dados é mostrado mais adiante no tutorial.
A ferramenta de scaffolding criou automaticamente um contexto de banco de dados e o registrou no contêiner da injeção de dependência. O código realçado a seguir é adicionado ao arquivo Program.cs
pelo scaffolder:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Solução de problemas com o exemplo concluído
Se você encontrar um problema que não possa resolver, compare seu código com o projeto concluído. Exibir ou baixar projeto concluído (como baixar).
Próximas etapas
Neste tutorial, classes são adicionadas para o gerenciamento de filmes em um banco de dados. As classes de modelo do aplicativo usam o Entity Framework Core (EF Core) para trabalhar com o banco de dados. EF Core é um O/RM (mapeador relacional de objetos) que simplifica o acesso a dados. Você escreve as classes de modelo primeiro e o EF Core cria o banco de dados.
As classes de modelo são conhecidas como classes POCO (de "Objetos CLR Básicos") porque não têm dependência do EF Core. Elas definem as propriedades dos dados que são armazenados no banco de dados.
Adicionar um modelo de dados
No Gerenciador de soluções, clique com o botão direito do mouse no projeto RazorPagesMovie>Adicionar>Nova Pasta. Nomeie a pasta
Models
.Clique com o botão direito do mouse na pasta
Models
. Selecione Adicionar>Classe. Dê à classe o nome Movie.Adicione as seguintes propriedades à classe
Movie
:using System.ComponentModel.DataAnnotations; namespace RazorPagesMovie.Models { public class Movie { public int ID { get; set; } public string Title { get; set; } = string.Empty; [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; public decimal Price { get; set; } } }
A classe Movie
contém:
O campo
ID
é necessário para o banco de dados para a chave primária.Um atributo [DataType] que especifica o tipo de dados na propriedade
ReleaseDate
. Com esse atributo:- O usuário não precisa inserir informações de horário no campo de data.
- Somente a data é exibida, não as informações de tempo.
DataAnnotations são abordados em um tutorial posterior.
Crie o projeto para verificar se não há erros de compilação.
Fazer scaffold do modelo de filme
Nesta seção, é feito o scaffold do modelo de filme. Ou seja, a ferramenta de scaffolding gera páginas para operações de CRUD (Criar, Ler, Atualizar e Excluir) para o modelo do filme.
Adicione o pacote NuGet
Microsoft.EntityFrameworkCore.Design
, que é necessário para a ferramenta de scaffolding.- No menu Ferramentas, selecione Gerenciador de Pacotes do NuGet>Gerenciar Pacotes do NuGet para a Solução
- Selecione a guia Procurar.
- Insira
Microsoft.EntityFrameworkCore.Design
e selecione-o na lista. - Verifique o Projeto e, em seguida, selecione Instalar
- Selecione Aceito na caixa de diálogo Aceitação da Licença.
Crie a pasta Pages/Movies:
- Clique com o botão direito do mouse na pasta Pages >Adicionar>Nova Pasta.
- Dê à pasta o nome Movies.
Clique com o botão direito do mouse na pasta Pages/Movies >Adicionar>Novo item com scaffold.
No diálogo Adicionar Scaffold, selecione Razor Pages usando o Entity Framework (CRUD)>Adicionar.
Conclua a caixa de diálogo Adicionar Razor Pages usando o Entity Framework (CRUD):
- Na lista suspensa Classe de modelo, selecione Filme (RazorPagesMovie.Models).
- Na linha Classe de contexto de dados, selecione o sinal + (adição).
- Na caixa de diálogo Adicionar contexto de dados, o nome da classe
RazorPagesMovie.Data.RazorPagesMovieContext
é gerado.
- Na caixa de diálogo Adicionar contexto de dados, o nome da classe
- Selecione Adicionar.
Se você receber uma mensagem de erro informando que precisa instalar o pacote
Microsoft.EntityFrameworkCore.SqlServer
, repita as etapas começando com Adicionar>Novo Item com Scaffold.
O arquivo appsettings.json
é atualizado com a cadeia de conexão usada para se conectar a um banco de dados local.
Aviso
Este artigo usa um banco de dados local que não exige que o usuário seja autenticado. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos de teste e produção implantados, consulte Fluxos de autenticação seguros.
Arquivos criados e atualizados
O processo de scaffold cria os arquivos a seguir:
- Pages/Movies: Create, Delete, Details, Edit e Index.
Data/RazorPagesMovieContext.cs
Os arquivos criados são explicados no próximo tutorial.
O processo de scaffold adiciona o seguinte código realçado ao arquivo Program.cs
:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
As alterações Program.cs
são explicadas posteriormente neste tutorial.
Criar o esquema de banco de dados inicial usando o recurso de migração do EF
O recurso de migrações no Entity Framework Core fornece uma maneira de:
- Crie o esquema inicial do banco de dados.
- Atualize incrementalmente o esquema de banco de dados para mantê-lo em sincronia com o modelo de dados do aplicativo. Os dados existentes no banco de dados são preservados.
Nesta seção, a janela do PMC (Console de Gerenciador de Pacotes) é usada para:
- Adicione uma migração inicial.
- Atualize o banco de dados com a migração inicial.
No menu Ferramentas, selecione Gerenciador de Pacotes NuGet>Console do Gerenciador de Pacotes.
No PMC, insira os seguintes comandos:
Add-Migration InitialCreate Update-Database
Os comandos anteriores instalam as ferramentas do Entity Framework Core e executam o comando migrations
para gerar o código que cria o esquema inicial do banco de dados.
O seguinte aviso é exibido, que é abordado em uma etapa posterior:
Nenhum tipo foi especificado para a coluna decimal 'Preço' no tipo de entidade 'Filme'. Isso fará com que valores sejam truncados silenciosamente se não couberem na precisão e na escala padrão. Especifique explicitamente o tipo de coluna do SQL Server que pode acomodar todos os valores usando 'HasColumnType()'.
O comando migrations
gera código para criar o esquema de banco de dados inicial. O esquema é baseado no modelo especificado em DbContext
. O argumento InitialCreate
é usado para nomear as migrações. Qualquer nome pode ser usado, mas, por convenção, um nome que descreve a migração é selecionado.
O comando update
executa o método Up
em migrações que não foram aplicadas. Nesse caso, update
executa o método Up
no arquivo Migrations/<time-stamp>_InitialCreate.cs
, que cria o banco de dados.
Examinar o contexto registrado com a injeção de dependência
O ASP.NET Core é construído com a injeção de dependência. Serviços, como o contexto de banco de dados do EF Core, são registrados com injeção de dependência durante a inicialização do aplicativo. Os componentes que exigem esses serviços (por exemplo, o Razor Pages) são fornecidos por meio dos parâmetros do construtor. O código de construtor que obtém uma instância de contexto do banco de dados é mostrado mais adiante no tutorial.
A ferramenta de scaffolding criou automaticamente um contexto de banco de dados e o registrou no contêiner da injeção de dependência. O código realçado a seguir é adicionado ao arquivo Program.cs
pelo scaffolder:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
O contexto de dados RazorPagesMovieContext
:
- Deriva de Microsoft.EntityFrameworkCore.DbContext.
- Especifica quais entidades são incluídas no modelo de dados.
- Coordena a funcionalidade EF Core, como Criar, Ler, Atualizar e Excluir, para o modelo
Movie
.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie>? Movie { get; set; }
}
}
O código anterior cria uma propriedade DbSet<Movie> para o conjunto de entidades. Na terminologia do Entity Framework, um conjunto de entidades normalmente corresponde a uma tabela de banco de dados. Uma entidade corresponde a uma linha da tabela.
O nome da cadeia de conexão é passado para o contexto com a chamada de um método em um objeto DbContextOptions. Para o desenvolvimento local, o Sistema de configuração lê a cadeia de conexão do arquivo appsettings.json
.
Testar o aplicativo
Executar o aplicativo e acrescentar
/Movies
à URL no navegador (http://localhost:port/movies
).Você receberá a seguinte mensagem de erro:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed. Login failed for user 'User-name'.
Você perdeu a etapa de migrações.
Teste o link Criar.
Observação
Talvez você não consiga inserir casas decimais ou vírgulas no campo
Price
. Para dar suporte à validação do jQuery para localidades com idiomas diferentes do inglês que usam uma vírgula (",") para um ponto decimal e formatos de data diferentes do inglês dos EUA, o aplicativo precisa ser globalizado. Para obter instruções sobre a globalização, consulte esse problema no GitHub.Teste os links Editar, Detalhes e Excluir.
O tutorial a seguir explica os arquivos criados por scaffolding.
Solução de problemas com o exemplo concluído
Se você encontrar um problema que não possa resolver, compare seu código com o projeto concluído. Exibir ou baixar projeto concluído (como baixar).
Próximas etapas
Nesta seção, classes são adicionadas para o gerenciamento de filmes em um banco de dados. As classes de modelo do aplicativo usam o Entity Framework Core (EF Core) para trabalhar com o banco de dados. EF Core é um O/RM (mapeador relacional de objetos) que simplifica o acesso a dados. Você escreve as classes de modelo primeiro e o EF Core cria o banco de dados.
As classes de modelo são conhecidas como classes POCO (de "Objetos CLR Básicos") porque não têm dependência do EF Core. Elas definem as propriedades dos dados que são armazenados no banco de dados.
Exibir ou baixar um código de exemplo (como baixar).
Adicionar um modelo de dados
No Gerenciador de soluções, clique com o botão direito do mouse no projeto RazorPagesMovie>Adicionar>Nova Pasta. Nomeie a pasta
Models
.Clique com o botão direito do mouse na pasta
Models
. Selecione Adicionar>Classe. Dê à classe o nome Movie.Adicione as seguintes propriedades à classe
Movie
:using System; using System.ComponentModel.DataAnnotations; namespace RazorPagesMovie.Models { public class Movie { public int ID { get; set; } public string Title { get; set; } [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } public decimal Price { get; set; } } }
A classe Movie
contém:
O campo
ID
é necessário para o banco de dados para a chave primária.[DataType(DataType.Date)]
: o atributo [DataType] especifica o tipo de dados (Date
). Com esse atributo:- O usuário não precisa inserir informações de horário no campo de data.
- Somente a data é exibida, não as informações de tempo.
DataAnnotations são abordados em um tutorial posterior.
Crie o projeto para verificar se não há erros de compilação.
Fazer scaffold do modelo de filme
Nesta seção, é feito o scaffold do modelo de filme. Ou seja, a ferramenta de scaffolding gera páginas para operações de CRUD (Criar, Ler, Atualizar e Excluir) para o modelo do filme.
Crie uma pasta Pages/Movies:
- Clique com o botão direito do mouse na pasta Pages >Adicionar>Nova Pasta.
- Dê à pasta o nome Movies.
Clique com o botão direito do mouse na pasta Pages/Movies >Adicionar>Novo item com scaffold.
No diálogo Adicionar Scaffold, selecione Razor Pages usando o Entity Framework (CRUD)>Adicionar.
Conclua a caixa de diálogo Adicionar Razor Pages usando o Entity Framework (CRUD):
- Na lista suspensa Classe de modelo, selecione Filme (RazorPagesMovie.Models).
- Na linha Classe de contexto de dados, selecione o sinal + (adição).
- Na caixa de diálogo Adicionar contexto de dados, o nome da classe
RazorPagesMovie.Data.RazorPagesMovieContext
é gerado.
- Na caixa de diálogo Adicionar contexto de dados, o nome da classe
- Selecione Adicionar.
O arquivo appsettings.json
é atualizado com a cadeia de conexão usada para se conectar a um banco de dados local.
Aviso
Este artigo usa um banco de dados local que não exige que o usuário seja autenticado. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos de teste e produção implantados, consulte Fluxos de autenticação seguros.
Arquivos criados e atualizados
O processo de scaffold cria os arquivos a seguir:
- Pages/Movies: Create, Delete, Details, Edit e Index.
Data/RazorPagesMovieContext.cs
Arquivos atualizados
Startup.cs
Os arquivos criados e atualizados são explicados na próxima seção.
Criar o esquema de banco de dados inicial usando o recurso de migração do EF
O recurso de migrações no Entity Framework Core fornece uma maneira de:
- Crie o esquema inicial do banco de dados.
- Atualize incrementalmente o esquema de banco de dados para mantê-lo em sincronia com o modelo de dados do aplicativo. Os dados existentes no banco de dados são preservados.
Nesta seção, a janela do PMC (Console de Gerenciador de Pacotes) é usada para:
- Adicione uma migração inicial.
- Atualize o banco de dados com a migração inicial.
No menu Ferramentas, selecione Gerenciador de Pacotes NuGet>Console do Gerenciador de Pacotes.
No PMC, insira os seguintes comandos:
Add-Migration InitialCreate Update-Database
Para SQL Server, os comandos anteriores geram o seguinte aviso: "Nenhum tipo foi especificado para a coluna decimal 'Price' no tipo de entidade 'Movie'. Isso fará com que valores sejam truncados silenciosamente se não couberem na precisão e na escala padrão. Especifique explicitamente o tipo de coluna do SQL Server que pode acomodar todos os valores usando 'HasColumnType()'.”
Ignore o aviso, pois ele será abordado em uma etapa posterior.
O comando migrations
gera código para criar o esquema de banco de dados inicial. O esquema é baseado no modelo especificado em DbContext
. O argumento InitialCreate
é usado para nomear as migrações. Qualquer nome pode ser usado, mas, por convenção, um nome que descreve a migração é selecionado.
O comando update
executa o método Up
em migrações que não foram aplicadas. Nesse caso, update
executa o método Up
no arquivo Migrations/<time-stamp>_InitialCreate.cs
, que cria o banco de dados.
Examinar o contexto registrado com a injeção de dependência
O ASP.NET Core é construído com a injeção de dependência. Serviços, como o contexto de banco de dados do EF Core, são registrados com injeção de dependência durante a inicialização do aplicativo. Os componentes que exigem esses serviços (por exemplo, o Razor Pages) são fornecidos por meio dos parâmetros do construtor. O código de construtor que obtém uma instância de contexto do banco de dados é mostrado mais adiante no tutorial.
A ferramenta de scaffolding criou automaticamente um contexto de banco de dados e o registrou no contêiner da injeção de dependência.
Examine o método Startup.ConfigureServices
. A linha destacada foi adicionada pelo scaffolder:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
RazorPagesMovieContext
coordena a funcionalidade EF Core, como Criar, Ler, Atualizar e Excluir, para o modelo Movie
. O contexto de dados (RazorPagesMovieContext
) deriva de Microsoft.EntityFrameworkCore.DbContext. O contexto de dados especifica quais entidades são incluídas no modelo de dados.
using Microsoft.EntityFrameworkCore;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (
DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
}
}
O código anterior cria uma propriedade DbSet<Movie> para o conjunto de entidades. Na terminologia do Entity Framework, um conjunto de entidades normalmente corresponde a uma tabela de banco de dados. Uma entidade corresponde a uma linha da tabela.
O nome da cadeia de conexão é passado para o contexto com a chamada de um método em um objeto DbContextOptions. Para o desenvolvimento local, o Sistema de configuração lê a cadeia de conexão do arquivo appsettings.json
.
Testar o aplicativo
Executar o aplicativo e acrescentar
/Movies
à URL no navegador (http://localhost:port/movies
).Você receberá a seguinte mensagem de erro:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed. Login failed for user 'User-name'.
Você perdeu a etapa de migrações.
Teste o link Criar.
Observação
Talvez você não consiga inserir casas decimais ou vírgulas no campo
Price
. Para dar suporte à validação do jQuery para localidades com idiomas diferentes do inglês que usam uma vírgula (",") para um ponto decimal e formatos de data diferentes do inglês dos EUA, o aplicativo precisa ser globalizado. Para obter instruções sobre a globalização, consulte esse problema no GitHub.Teste os links Editar, Detalhes e Excluir.
Registro em log do SQL do Entity Framework Core
A configuração de log geralmente é fornecida pela seção Logging
dos arquivos appsettings.{Environment}.json
. Para registrar instruções SQL em log, adicione "Microsoft.EntityFrameworkCore.Database.Command": "Information"
ao arquivo appsettings.Development.json
:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
,"Microsoft.EntityFrameworkCore.Database.Command": "Information"
}
},
"AllowedHosts": "*"
}
Com o JSON anterior, as instruções SQL são exibidas na linha de comando e na janela de saída do Visual Studio.
Para obter mais informações, consulte Registrando em log no .NET Core e no ASP.NET Core e este tópico do GitHub.
O tutorial a seguir explica os arquivos criados por scaffolding.
Próximas etapas
Nesta seção, classes são adicionadas para o gerenciamento de filmes. As classes de modelo do aplicativo usam o Entity Framework Core (EF Core) para trabalhar com o banco de dados. EF Core é um O/RM (mapeador relacional de objetos) que simplifica o acesso a dados.
As classes de modelo são conhecidas como classes POCO (de "objetos CLR básicos") porque não têm nenhuma dependência do EF Core. Elas definem as propriedades dos dados que são armazenados no banco de dados.
Exibir ou baixar um código de exemplo (como baixar).
Aviso
Este artigo usa um banco de dados local que não exige que o usuário seja autenticado. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos de teste e produção implantados, consulte Fluxos de autenticação seguros.
Adicionar um modelo de dados
Clique com o botão direito do mouse no projeto RazorPagesMovie>Adicionar>Nova Pasta. Nomeie a pasta Models
.
Clique com o botão direito do mouse na pasta Models
. Selecione Adicionar>Classe. Dê à classe o nome Movie.
Adicione as seguintes propriedades à classe Movie
:
using System;
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models
{
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
}
A classe Movie
contém:
O campo
ID
é necessário para o banco de dados para a chave primária.[DataType(DataType.Date)]
: o atributo DataType especifica o tipo de dados (Date
). Com esse atributo:- O usuário não precisa inserir informações de tempo no campo de data.
- Somente a data é exibida, não as informações de tempo.
DataAnnotations são abordados em um tutorial posterior.
DataAnnotations são abordados em um tutorial posterior.
Crie o projeto para verificar se não há erros de compilação.
Fazer scaffold do modelo de filme
Nesta seção, é feito o scaffold do modelo de filme. Ou seja, a ferramenta de scaffolding gera páginas para operações de CRUD (Criar, Ler, Atualizar e Excluir) para o modelo do filme.
Crie uma pasta Pages/Movies:
- Clique com o botão direito do mouse na pasta Pages >Adicionar>Nova Pasta.
- Dê à pasta o nome Movies.
Clique com o botão direito do mouse na pasta Pages/Movies >Adicionar>Novo item com scaffold.
No diálogo Adicionar Scaffold, selecione Razor Pages usando o Entity Framework (CRUD)>Adicionar.
Conclua a caixa de diálogo Adicionar Razor Pages usando o Entity Framework (CRUD):
- Na lista suspensa Classe de modelo, selecione Filme (RazorPagesMovie.Models).
- Na linha Classe de contexto de dados, selecione o sinal de adição (+) e altere o nome gerado de RazorPagesMovie.
Models
.RazorPagesMovieContext para RazorPagesMovie.Data.RazorPagesMovieContext. Esta alteração não é obrigatória. Ela cria a classe de contexto do banco de dados com o namespace correto. - Selecione Adicionar.
O arquivo appsettings.json
é atualizado com a cadeia de conexão usada para se conectar a um banco de dados local.
Arquivos criados
O processo de scaffold cria e atualiza os arquivos a seguir:
- Pages/Movies: Create, Delete, Details, Edit e Index.
Data/RazorPagesMovieContext.cs
Atualizado
Startup.cs
Os arquivos criados e atualizados são explicados na próxima seção.
Migração inicial
Nesta seção, o PMC (Console de Gerenciador de Pacotes) é usado para:
- Adicione uma migração inicial.
- Atualize o banco de dados com a migração inicial.
No menu Ferramentas, selecione Gerenciador de Pacotes NuGet>Console do Gerenciador de Pacotes.
No PMC, insira os seguintes comandos:
Add-Migration InitialCreate
Update-Database
Os comandos anteriores geram o seguinte aviso: "Nenhum tipo foi especificado para a coluna decimal 'Price' no tipo de entidade 'Movie'. Isso fará com que valores sejam truncados silenciosamente se não couberem na precisão e na escala padrão. Especifique explicitamente o tipo de coluna do SQL Server que pode acomodar todos os valores usando 'HasColumnType()'.”
Ignore o aviso, pois ele será abordado em uma etapa posterior.
O comando migrações gera código para criar o esquema de banco de dados inicial. O esquema é baseado no modelo especificado em DbContext
. O argumento InitialCreate
é usado para nomear as migrações. Qualquer nome pode ser usado, mas, por convenção, um nome que descreve a migração é selecionado.
O comando update
executa o método Up
em migrações que não foram aplicadas. Nesse caso, update
executa o método Up
no arquivo Migrations/<time-stamp>_InitialCreate.cs
, que cria o banco de dados.
Examinar o contexto registrado com a injeção de dependência
O ASP.NET Core é construído com a injeção de dependência. Serviços, como o contexto de banco de dados do EF Core, são registrados com injeção de dependência durante a inicialização do aplicativo. Os componentes que exigem esses serviços, por exemplo, o Razor Pages, recebem esses serviços por meio de parâmetros do construtor. O código de construtor que obtém uma instância de contexto do banco de dados é mostrado mais adiante no tutorial.
A ferramenta de scaffolding criou automaticamente um contexto de banco de dados e o registrou no contêiner da injeção de dependência.
Examine o método Startup.ConfigureServices
. A linha destacada foi adicionada pelo scaffolder:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
RazorPagesMovieContext
coordena a funcionalidade EF Core, como Criar, Ler, Atualizar e Excluir, para o modelo Movie
. O contexto de dados (RazorPagesMovieContext
) deriva de Microsoft.EntityFrameworkCore.DbContext. O contexto de dados especifica quais entidades são incluídas no modelo de dados.
using Microsoft.EntityFrameworkCore;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (
DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
}
}
O código anterior cria uma propriedade DbSet<Movie> para o conjunto de entidades. Na terminologia do Entity Framework, um conjunto de entidades normalmente corresponde a uma tabela de banco de dados. Uma entidade corresponde a uma linha da tabela.
O nome da cadeia de conexão é passado para o contexto com a chamada de um método em um objeto DbContextOptions. Para o desenvolvimento local, o Sistema de configuração lê a cadeia de conexão do arquivo appsettings.json
.
Testar o aplicativo
- Executar o aplicativo e acrescentar
/Movies
à URL no navegador (http://localhost:port/movies
).
Se você obtiver o erro:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.
Você perdeu a etapa de migrações.
Teste o link Criar.
Observação
Talvez você não consiga inserir casas decimais ou vírgulas no campo
Price
. Para dar suporte à validação do jQuery para localidades com idiomas diferentes do inglês que usam uma vírgula (",") para um ponto decimal e formatos de data diferentes do inglês dos EUA, o aplicativo precisa ser globalizado. Para obter instruções sobre a globalização, consulte esse problema no GitHub.Teste os links Editar, Detalhes e Excluir.
O tutorial a seguir explica os arquivos criados por scaffolding.