Exercício: engenharia reversa de um banco de dados existente

Concluído

O gerente da Contoso Pizza pediu que você adicionasse um ponto de extremidade para que a empresa possa exibir cupons no aplicativo deles. Os cupons residem em um banco de dados existente. Nessa unidade, você criará o scaffolding de um banco de dados existente e modificará a classe de entidade resultante.

Inspecionar o banco de dados de promoções

Dê uma olhada no banco de dados que você usará para gerar o código scaffolded:

  1. No painel Explorador, expanda o diretório Promoções, clique com o botão direito do mouse no arquivo Promotions.db e selecione Abrir Banco de Dados.

    O novo banco de dados é aberto na pasta SQLite Explorer.

  2. Na pasta SQLite Explorer, expanda os nós Promotions.db e Cupons. Observe o esquema de dados.

  3. Clique com o botão direito do mouse no nó Cupons e selecione Mostrar tabela. Inspecione os dados do cupom.

Fazer scaffold do contexto de promoções e do modelo de cupom

Agora, você usa o banco de dados para fazer scaffolding do código:

  1. Execute o comando a seguir:

    dotnet ef dbcontext scaffold "Data Source=Promotions/Promotions.db" Microsoft.EntityFrameworkCore.Sqlite --context-dir Data --output-dir Models   
    

    O comando anterior:

    • Faça o scaffold de um DbContext e classes de modelo usando a cadeia de conexão fornecida.
    • Especifica o uso do provedor de banco de dados Microsoft.EntityFrameworkCore.Sqlite.
    • Especifica os diretórios para as classes DbContext e modelo resultantes.

    Observação

    Neste exercício, ignore o aviso sobre a presença da cadeia de conexão no código-fonte. Em um código do mundo real, sempre armazene as cadeias de conexão em um local seguro.

  2. Abra Models\Coupon.cs. A propriedade Expiration é definida como uma cadeia de caracteres, pois o SQLite não tem um tipo de dados datetime. Altere o tipo Expiration de string? para DateTime. O EF Core gerencia a conversão de datetime em dados da cadeia de caracteres.

    using System;
    using System.Collections.Generic;
    
    namespace ContosoPizza.Models
    {
        public partial class Coupon
        {
            public long Id { get; set; }
            public string Description { get; set; } = null!;
            public DateTime Expiration { get; set; }
        }
    }
    

    Dica

    Se o banco de dados for alterado, você poderá gerar novos arquivos scaffolded. Os arquivos gerados sempre são substituídos, mas são criados como classes partial que podem ser estendias com propriedades e comportamentos personalizados nos próprios arquivos separados.

Adicionar um ponto de extremidade do cupom

Antes de você testar o código com scaffolding, precisa adicionar um ponto de extremidade à API. Então, em seguida, adicione um novo controlador de API.

Para entender melhor como os controladores de API funcionam, confira Criar uma API Web com controladores ASP.NET Core.

  1. Na pasta Controladores, adicione um arquivo chamado CouponController.cs que contenha o seguinte código:

    using ContosoPizza.Data;
    using ContosoPizza.Models;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.EntityFrameworkCore;
    
    namespace ContosoPizza.Controllers;
    
    [ApiController]
    [Route("[controller]")]
    public class CouponController : ControllerBase
    {
        PromotionsContext _context;
    
        public CouponController(PromotionsContext context)
        {
            _context = context;
        }
    
        [HttpGet]
        public IEnumerable<Coupon> Get()
        {
            return _context.Coupons
                .AsNoTracking()
                .ToList();
        }
    }
    

    Isso adiciona um ponto de extremidade api/coupon à API.

    No código anterior:

    • Um objeto PromotionsContext é injetado no construtor.
    • O método Get retorna todos os cupons.
  2. Em Program.cs, substitua o comentário // Add the PromotionsContext pelo seguinte código:

    builder.Services.AddSqlite<PromotionsContext>("Data Source=Promotions/Promotions.db");
    

    O anterior registra PromotionsContext com o sistema de injeção de dependência.

  3. Salve todas as alterações e execute o aplicativo usando dotnet run.

Testar o ponto de extremidade

Agora que o ponto de extremidade foi adicionado, vamos testar as operações de cupom:

  1. Acesse a interface do usuário do Swagger da API como você fez em um exercício anterior (ou atualize a interface do usuário existente no navegador).

  2. No título Cupom, expanda a operação GET e selecione Experimentar.

  3. Selecione Executar. O corpo da resposta mostra os cupons do banco de dados:

    [
    {
        "id": 1,
        "description": "Buy 1 get 1 free",
        "expiration": "2025-01-01T00:00:00"
    },
    {
        "id": 2,
        "description": "4 large pizzas for $40",
        "expiration": "2024-06-30T00:00:00"
    }
    ]
    

    Observe que expiration é um valor datetime.

É isso! Você criou e modificou o scaffolding de um banco de dados existente!