Exercício – Engenharia inversa a partir de uma base de dados existente
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:
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 .
Na pasta Explorador do SQLite , expanda os nós Promotions.db e Cupões . Repare no esquema de dados.
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:
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.
- Estrutura e
Abra Models\Coupon.cs. A
Expiration
propriedade é definida como uma cadeia porque o SQLite não tem um tipo de dados datetime. Altere oExpiration
tipo destring?
paraDateTime
. 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.
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.
- Um
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.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:
Aceda à IU do Swagger da API, como fez num exercício anterior (ou atualize a IU existente no browser).
No cabeçalho Cupão, expanda a operação GET e selecione Experimentar.
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!