Exercício: engenharia reversa de um banco de dados existente
O gerente da Contoso Pizza pediu para você adicionar 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:
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.
Na pasta SQLite Explorer, expanda os nós Promotions.db e Cupons. Observe o esquema de dados.
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:
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.
- Faça o scaffold de um
Abra Modelos\Coupon.cs e inspecione o modelo com scaffold.
using System; using System.Collections.Generic; namespace ContosoPizza.Models { public partial class Coupon { public int Id { get; set; } public string Description { get; set; } = null!; public DateOnly? Expiration { get; set; } } }
Como o SQLite tem um conjunto limitado de tipos em comparação ao C#, a ferramenta para fazer scaffolding fez inferências sobre quais tipos de C# usar. Por exemplo, a coluna de banco de dados
Expiration
foi definida como uma cadeia de caracteres porque o SQLite não tem um tipo de dados de data. A ferramenta para fazer scaffolding inferiu que o tipo C# deve ser baseado emDateOnly?
nos dados no banco de dados.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 estendidas 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. Em seguida, você adiciona um novo controlador de API.
Para entender melhor como os controladores de API funcionam, confira Criar uma API Web com controladores ASP.NET Core.
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.
- Um objeto
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.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:
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).
No título Cupom, expanda a operação GET e selecione o botão Experimentar.
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" } ]
Aviso de que
expiration
é um valor datetime.
É isso! Você criou e modificou o scaffolding de um banco de dados existente.