Database Overview
Huellitas uses PostgreSQL as its database engine and Entity Framework Core 9.0 as the Object-Relational Mapper (ORM). The database follows a relational design with six main tables.Database Schema
Entity Models
Usuario Entity
Represents customer and admin accounts:Usuario.cs:8
passwordHashstores BCrypt-hashed passwordssegmentoClientefor customer segmentation (VIP, Regular, etc.)- Virtual navigation properties enable lazy loading
Rol Entity
Defines user roles (Admin, Cliente):Rol.cs:8
Producto Entity
Represents pet shop products:Producto.cs:10
decimal(18,2)ensures precise pricing (2 decimal places)stockMinimofor low stock alertsimgstores image URL or path
Categoria Entity
Product categories (Food, Toys, Accessories, etc.):Categoria.cs:8
Pedido Entity
Represents customer orders:Pedido.cs:8
Detalle Entity
Order line items (products in an order):Detalle.cs:8
precioUnitario is stored in Detalle to preserve historical pricing, even if product prices change later.
DbContext Configuration
TheHuellitasContext class manages database connections and entity sets:
huellitasContext.cs:6
Connection String Registration
Registered inProgram.cs:51-52:
Program.cs:51
Connection String Format
appsettings.json
Entity Framework Migrations
Creating Migrations
Migrations track database schema changes over time:Initial Migration
The first migration creates Categoria and Producto tables:20251226222715_Inicial.cs:14
Migration History
- 20251226222715_Inicial - Created Categoria and Producto tables
- 20251226224227_AgregandoTablasRestantes - Added Usuario, Rol, Pedido, and Detalle tables
Repository Pattern
Repositories abstract database operations. Example for products:Interface Definition
IProductoRepositorio.cs:6
Implementation
ProductoRepositorio.cs:10
Common Queries
Eager Loading (Include Related Data)
Filtering and Sorting
Aggregations
Database Seeding
For development, seed initial data:Connection Pooling
Entity Framework Core automatically manages connection pooling. Configure in connection string:Best Practices
Always Use Async Methods
Always Use Async Methods
Use
ToListAsync(), FirstOrDefaultAsync(), SaveChangesAsync() to avoid blocking threads.Dispose DbContext Properly
Dispose DbContext Properly
Use dependency injection with scoped lifetime. ASP.NET Core handles disposal automatically.
Use Include for Related Data
Use Include for Related Data
Validate Input
Validate Input
Use data annotations (
[Required], [MaxLength]) for basic validation. Add business logic validation in services.Use Transactions for Multi-Step Operations
Use Transactions for Multi-Step Operations
Wrap multiple operations in
_context.Database.BeginTransaction() for atomicity.Troubleshooting
Migration Errors
Issue: “Build failed” during migration. Solution: Ensure all projects compile successfully before creating migrations.Connection Refused
Issue: “Connection refused” to PostgreSQL. Solution: Check PostgreSQL is running and connection string is correct:Foreign Key Constraint Violation
Issue: Cannot insert/delete due to foreign key constraint. Solution: Ensure referenced entities exist before inserting, or useOnDelete: ReferentialAction.Cascade for automatic deletion.
Performance Tips
Use AsNoTracking for Read-Only Queries
Projection for Specific Fields
Batch Operations
Next Steps
Setup Guide
Configure your development environment
Authentication
Learn about JWT and user management