Ejercicio: Ingeniería inversa de una base de datos existente
El gerente 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:
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.
En el panel Explorador de SQLite, expanda los nodos Promotions.db y Coupons. Observe el esquema de datos.
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:
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.
- Aplica scaffolding a
Abra Models\Coupon.cs e inspeccione el modelo con scaffolding.
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; } } }
Dado que SQLite tiene un conjunto limitado de tipos, en comparación con C#, la herramienta de scaffolding ha realizado inferencias en cuanto a los tipos de C# que se van a usar. Por ejemplo, la columna de base de datos
Expiration
se definió como una cadena, ya que SQLite no tiene un tipo de datos de fecha. La herramienta de scaffolding deduce que el tipo de C# debe basarseDateOnly?
en los datos de la base de datos.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
, con el fin de que pueda ampliarlos con propiedades y comportamientos personalizados que se encuentran 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, agregará 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.
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.
- Se inserta un objeto
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.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:
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.
En el encabezado Cupón, expanda la operación GET y seleccione el botón Probarlo.
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" } ]
Observe que
expiration
es un valor datetime.
Eso es todo. Ha creado y modificado el scaffolding a partir de una base de datos existente.