Exercício – Engenharia inversa a partir de uma base de dados existente

Concluído

O gestor da Contoso Pizza pediu-lhe para adicionar um ponto final para que a empresa possa apresentar cupões na respetiva aplicação. Os cupões residem numa base de dados existente. Nesta unidade, vai criar estrutura a partir de uma base de dados existente e modificar a classe de entidade resultante.

Inspecionar a base de dados de promoções

Veja a base de dados que irá utilizar para gerar o código estruturado:

  1. No painel Explorador , expanda o diretório Promoções , clique com o botão direito do rato no ficheiro Promotions.db e, em seguida, selecione Abrir Base de Dados.

    A nova base de dados é aberta na pasta Explorador do SQLite .

  2. Na pasta Explorador do SQLite , expanda os nós Promotions.db e Cupões . Repare no esquema de dados.

  3. Clique com o botão direito do rato no nó Cupões e selecione Mostrar tabela. Inspecione os dados do cupão.

Estruturar o contexto de promoções e o modelo de cupões

Agora, utilize a base de dados para estruturar o código:

  1. Execute o seguinte comando:

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

    O comando anterior:

    • Estrutura e DbContext classes de modelo com a cadeia de ligação fornecida.
    • Especifica a utilização do fornecedor de Microsoft.EntityFrameworkCore.Sqlite bases de dados.
    • Especifica diretórios para as classes resultantes DbContext e de modelo.

    Nota

    Neste exercício, pode ignorar o aviso sobre a cadeia de ligação estar no código fonte. No código do mundo real, armazene sempre as cadeias de ligação numa localização segura.

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

    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 a base de dados mudar, pode gerar novos ficheiros estruturados. Os ficheiros gerados são substituídos sempre, mas são criados como partial classes, para que possa expandi-los com propriedades e comportamentos personalizados nos seus próprios ficheiros separados.

Adicionar um ponto final de cupão

Antes de poder testar o código estruturado, tem de adicionar um ponto final à API. Em seguida, adicione um novo controlador de API.

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

  1. Na pasta Controladores , adicione um ficheiro com o nome CouponController.cs que contém 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();
        }
    }
    

    Este código adiciona um api/coupon ponto final à API.

    No código anterior:

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

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

    Este código é registado PromotionsContext no sistema de injeção de dependências.

  3. Guarde todas as suas alterações e execute a aplicação com dotnet run.

Testar o ponto final

Agora que o ponto final foi adicionado, teste as operações de cupões:

  1. Aceda à IU do Swagger da API, como fez num exercício anterior (ou atualize a IU existente no browser).

  2. No cabeçalho Cupão, expanda a operação GET e selecione Experimentar.

  3. Selecione Execute (Executar). O corpo da resposta mostra os cupões da base 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"
    }
    ]
    

    Tenha em atenção que expiration se trata de um valor datetime.

Já está! Criou e modificou os andaimes a partir de uma base de dados existente!