Ejercicio: Ingeniería inversa de una base de datos existente

Completado

El administrador de Contoso Pizza le ha pedido que agregue un punto de conexión para que la empresa pueda mostrar cupones en su aplicación. Los cupones residen en una base de datos existente. En esta unidad, va a aplicar scaffolding a partir de una base de datos existente y a modificar la clase de entidad resultante.

Inspección de la base de datos de promociones

Eche un vistazo a la base de datos que usará para generar el código con scaffolding:

  1. En el panel Explorador, expanda el directorio Promociones, haga clic con el botón derecho en el archivo Promotions.db y seleccione Abrir base de datos.

    La nueva base de datos se abre en la carpeta Explorador de SQLite.

  2. En el panel Explorador de SQLite, expanda los nodos Promotions.db y Coupons. Observe el esquema de datos.

  3. Haga clic con el botón derecho en el nodo Coupons y seleccione Mostrar tabla. Inspeccione los datos del cupón.

Aplique scaffolding al contexto de las promociones y al modelo de cupón

Ahora, use la base de datos para aplicar scaffolding al código:

  1. Ejecute el comando siguiente:

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

    El comando anterior:

    • Aplica scaffolding a DbContext y a las clases de modelo con la cadena de conexión proporcionada.
    • Especifica que se va a usar el proveedor de base de datos Microsoft.EntityFrameworkCore.Sqlite.
    • Especifica directorios para las clases de modelo y DbContext resultantes.

    Nota

    En este ejercicio, puede omitir la advertencia sobre la cadena de conexión que se encuentra en el código fuente. En el código real, almacene siempre las cadenas de conexión en una ubicación segura.

  2. Abra Models\Coupon.cs. La propiedad Expiration se define como una cadena, ya que SQLite no tiene un tipo de datos datetime. Cambie el tipo Expiration de string? a DateTime. EF Core administra la conversión de datos datetime a datos de cadena.

    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; }
        }
    }
    

    Sugerencia

    Si cambia la base de datos, puede generar nuevos archivos de scaffolding. Los archivos generados se sobrescriben siempre, pero se crean como clases partial que puede ampliar con propiedades y comportamientos personalizados en sus propios archivos independientes.

Adición de un punto de conexión de cupón

Para poder probar el código de scaffolding, debe agregar un punto de conexión a la API. A continuación, agregue un nuevo controlador de API.

Para comprender mejor cómo funcionan los controladores de API, consulte Creación de una API web con controladores de ASP.NET Core.

  1. En la carpeta Controladores, agregue un archivo llamado CouponController.cs que contenga el código siguiente:

    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 agrega un punto de conexión api/coupon a la API.

    En el código anterior:

    • Se inserta un objeto PromotionsContext en el constructor.
    • El método Get devuelve todos los cupones.
  2. En Program.cs, reemplace el comentario // Add the PromotionsContext por el código siguiente:

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

    Este código registra PromotionsContext en el sistema de inserción de dependencias.

  3. Guarde todos los cambios y ejecute la aplicación mediante dotnet run.

Prueba del punto de conexión

Ahora que se ha agregado el punto de conexión, pruebe las operaciones de cupones:

  1. Vaya a la interfaz de usuario de Swagger de la API como hizo en un ejercicio anterior, o bien actualice la interfaz de usuario existente en el explorador.

  2. En el encabezado Cupón, expanda la operación GET y seleccione Probarlo.

  3. Seleccione Execute(Ejecutar). El cuerpo de la respuesta muestra los cupones de la base de datos:

    [
    {
        "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"
    }
    ]
    

    Tenga en cuenta que expiration es un valor datetime.

Ya está. Ha creado y modificado el scaffolding a partir de una base de datos existente.