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.

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

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto RazorPagesMovie>Adicionar>Nova Pasta. Nomeie a pasta Models.

  2. Clique com o botão direito do mouse na pasta Models. Selecione Adicionar>Classe. Dê à classe o nome Movie.

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

  1. Crie a pasta Pages/Movies:

    1. Clique com o botão direito do mouse na pasta Pages>Adicionar>Nova Pasta.
    2. Dê à pasta o nome Movies.
  2. Clique com o botão direito do mouse na pasta Pages/Movies>Adicionar>Novo item com scaffold.

    Novo item com Scaffold

  3. No diálogo Adicionar Scaffold, selecione Razor Pages usando o Entity Framework (CRUD)>Adicionar.

    Adicionar scaffold

  4. Conclua a caixa de diálogo Adicionar Razor Pages usando o Entity Framework (CRUD):

    1. Na lista suspensa Classe de modelo, selecione Filme (RazorPagesMovie.Models).
    2. Na linha Classe de contexto de dados, selecione o sinal + (adição).
      1. Na caixa de diálogo Adicionar contexto de dados, o nome da classe RazorPagesMovie.Data.RazorPagesMovieContext é gerado.
      2. Na lista suspensa Provedor de banco de dados, selecione SQL Server.
    3. Selecione Adicionar.

    Adicionar páginas Razor

O arquivo appsettings.json é atualizado com a cadeia de conexão usada para se conectar a um banco de dados local.

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.
  1. No menu Ferramentas, selecione Gerenciador de Pacotes NuGet>Console do Gerenciador de Pacotes.

    Menu do PMC

  2. 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 em DbContext. O argumento InitialCreate é 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étodo Up em migrações que não foram aplicadas. Nesse caso, o comando executa o método Up no arquivo Migrations/<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

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

  2. Teste o link Criar.

    Página 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.

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

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto RazorPagesMovie>Adicionar>Nova Pasta. Nomeie a pasta Models.

  2. Clique com o botão direito do mouse na pasta Models. Selecione Adicionar>Classe. Dê à classe o nome Movie.

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

  1. Crie a pasta Pages/Movies:

    1. Clique com o botão direito do mouse na pasta Pages>Adicionar>Nova Pasta.
    2. Dê à pasta o nome Movies.
  2. Clique com o botão direito do mouse na pasta Pages/Movies>Adicionar>Novo item com scaffold.

    Novo item com Scaffold

  3. No diálogo Adicionar Scaffold, selecione Razor Pages usando o Entity Framework (CRUD)>Adicionar.

    Adicionar scaffold

  4. Conclua a caixa de diálogo Adicionar Razor Pages usando o Entity Framework (CRUD):

    1. Na lista suspensa Classe de modelo, selecione Filme (RazorPagesMovie.Models).
    2. Na linha Classe de contexto de dados, selecione o sinal + (adição).
      1. Na caixa de diálogo Adicionar contexto de dados, o nome da classe RazorPagesMovie.Data.RazorPagesMovieContext é gerado.
      2. Na lista suspensa Provedor de banco de dados, selecione SQL Server.
    3. Selecione Adicionar.

    Adicionar páginas Razor

O arquivo appsettings.json é atualizado com a cadeia de conexão usada para se conectar a um banco de dados local.

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.
  1. No menu Ferramentas, selecione Gerenciador de Pacotes NuGet>Console do Gerenciador de Pacotes.

    Menu do PMC

  2. 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 em DbContext. O argumento InitialCreate é 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étodo Up em migrações que não foram aplicadas. Nesse caso, o comando executa o método Up no arquivo Migrations/<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

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

  2. Teste o link Criar.

    Página 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.

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

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto RazorPagesMovie>Adicionar>Nova Pasta. Nomeie a pasta Models.

  2. Clique com o botão direito do mouse na pasta Models. Selecione Adicionar>Classe. Dê à classe o nome Movie.

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

  1. Adicione o pacote NuGet Microsoft.EntityFrameworkCore.Design, que é necessário para a ferramenta de scaffolding.

    1. No menu Ferramentas, selecione Gerenciador de Pacotes do NuGet>Gerenciar Pacotes do NuGet para a SoluçãoGerenciador de pacotes NuGet – gerenciar
    2. Selecione a guia Procurar.
    3. Insira Microsoft.EntityFrameworkCore.Design e selecione-o na lista.
    4. Verifique o Projeto e, em seguida, selecione Instalar
    5. Selecione Aceito na caixa de diálogo Aceitação da Licença. Gerenciador de Pacotes NuGet – adicionar pacote
  2. Crie a pasta Pages/Movies:

    1. Clique com o botão direito do mouse na pasta Pages>Adicionar>Nova Pasta.
    2. Dê à pasta o nome Movies.
  3. Clique com o botão direito do mouse na pasta Pages/Movies>Adicionar>Novo item com scaffold.

    Novo item com Scaffold

  4. No diálogo Adicionar Scaffold, selecione Razor Pages usando o Entity Framework (CRUD)>Adicionar.

    Adicionar scaffold

  5. Conclua a caixa de diálogo Adicionar Razor Pages usando o Entity Framework (CRUD):

    1. Na lista suspensa Classe de modelo, selecione Filme (RazorPagesMovie.Models).
    2. Na linha Classe de contexto de dados, selecione o sinal + (adição).
      1. Na caixa de diálogo Adicionar contexto de dados, o nome da classe RazorPagesMovie.Data.RazorPagesMovieContext é gerado.
    3. Selecione Adicionar.

    Adicionar páginas Razor

    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.

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.
  1. No menu Ferramentas, selecione Gerenciador de Pacotes NuGet>Console do Gerenciador de Pacotes.

    Menu do PMC

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

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

  2. Teste o link Criar.

    Página 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.

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

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto RazorPagesMovie>Adicionar>Nova Pasta. Nomeie a pasta Models.

  2. Clique com o botão direito do mouse na pasta Models. Selecione Adicionar>Classe. Dê à classe o nome Movie.

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

  1. Crie uma pasta Pages/Movies:

    1. Clique com o botão direito do mouse na pasta Pages>Adicionar>Nova Pasta.
    2. Dê à pasta o nome Movies.
  2. Clique com o botão direito do mouse na pasta Pages/Movies>Adicionar>Novo item com scaffold.

    Novo item com Scaffold

  3. No diálogo Adicionar Scaffold, selecione Razor Pages usando o Entity Framework (CRUD)>Adicionar.

    Adicionar scaffold

  4. Conclua a caixa de diálogo Adicionar Razor Pages usando o Entity Framework (CRUD):

    1. Na lista suspensa Classe de modelo, selecione Filme (RazorPagesMovie.Models).
    2. Na linha Classe de contexto de dados, selecione o sinal + (adição).
      1. Na caixa de diálogo Adicionar contexto de dados, o nome da classe RazorPagesMovie.Data.RazorPagesMovieContext é gerado.
    3. Selecione Adicionar.

    Adicionar páginas Razor

O arquivo appsettings.json é atualizado com a cadeia de conexão usada para se conectar a um banco de dados local.

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.
  1. No menu Ferramentas, selecione Gerenciador de Pacotes NuGet>Console do Gerenciador de Pacotes.

    Menu do PMC

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

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

  2. Teste o link Criar.

    Página 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.

  3. 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).

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.

Novo Item com Scaffold no VScode

No diálogo Adicionar Scaffold, selecione Razor Pages usando o Entity Framework (CRUD)>Adicionar.

Adicionar Scaffold no VScode

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.

Adicionar páginas Razor no VScode

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.

Menu do PMC

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.

    Página 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.

Próximas etapas