Este manual te guiará en la implementación de Entity Framework Core con una base de datos PostgreSQL. Aunque el enfoque principal está en Supabase, también se incluyen alternativas como PostgreSQL local o en Docker.
El proyecto está organizado en las siguientes capas:
- Discoteque.API: Capa de presentación y controladores
- Discoteque.Data: Capa de acceso a datos con Entity Framework
- Discoteque.Business: Capa de lógica de negocio
Ejecuta estos comandos en ambos proyectos (API y Data):
dotnet tool install --global dotnet-ef
cd Discoteque.API/
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
cd ../Discoteque.Data
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL Agrega la siguiente configuración en appsettings.Development.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"ConnectionStrings": {
"DiscotequeDatabase": "Host=[MYSERVER];Username=[MYUSERNAME];Password=[MYPASSWORD];Database=[MYDATABASE]"
}
}- Asegúrate de tener Docker instalado
- Usa el
docker-compose.ymlproporcionado:
docker-compose up -d- La cadena de conexión para Docker sería:
{
"ConnectionStrings": {
"DiscotequeDatabase": "Host=localhost;Username=postgres;Password=postgres;Database=discoteque;Port=5432"
}
}El proyecto implementa el patrón Unit of Work y Repository. El DiscotequeContext ya está configurado:
public class DiscotequeContext : DbContext
{
public DiscotequeContext(DbContextOptions<DiscotequeContext> options) : base(options)
{
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
}
// Tus DbSet aquí
// public DbSet<TuEntidad> TuEntidad { get; set; }
}builder.Services.AddDbContext<DiscotequeContext>(
opt => {
opt.UseNpgsql(builder.Configuration.GetConnectionString("DiscotequeDatabase"));
}
);Para desarrollo local, usa user-secrets:
cd Discoteque.API
dotnet user-secrets init
dotnet user-secrets set "ConnectionStrings:DiscotequeDatabase" "tu-cadena-de-conexion"El proyecto ya implementa estos patrones. Para usarlos:
public class TuController : ControllerBase
{
private readonly IUnitOfWork _unitOfWork;
public TuController(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public async Task<IActionResult> TuAccion()
{
var repositorio = _unitOfWork.GetRepository<TuEntidad>();
// Usar el repositorio
await _unitOfWork.SaveChangesAsync();
return Ok();
}
}- Crea la migración inicial:
cd Discoteque.API
dotnet ef migrations add InitialCreate --project ../Discoteque.Data- Configura el entorno:
Para Windows (PowerShell):
$Env:ASPNETCORE_ENVIRONMENT = "Development"Para Mac/Linux:
export ASPNETCORE_ENVIRONMENT=Development- Aplica la migración:
dotnet ef database updatePara verificar que la conexión funciona, puedes agregar este código temporal en tu Program.cs:
using (var scope = app.Services.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService<DiscotequeContext>();
try
{
await context.Database.CanConnectAsync();
Console.WriteLine("Conexión exitosa a la base de datos");
}
catch (Exception ex)
{
Console.WriteLine($"Error de conexión: {ex.Message}");
}
}Si decides usar Supabase:
-
Acceso: Inicia sesión en Supabase usando GitHub o SSO
-
Creación del Proyecto:
- Crea un nuevo proyecto
- Configura nombre y contraseña
- Selecciona el plan gratuito
-
Credenciales: Guarda de forma segura:
- Claves API (públicas)
- Rol de servicio (privado)
- URL del proyecto
- Secreto del token JWT
🔒 Seguridad:
- Nunca subas credenciales al control de versiones
- Usa variables de entorno o user-secrets en desarrollo
- En producción, usa servicios de configuración seguros
-
Error de conexión:
- Verifica que el servidor esté accesible
- Confirma las credenciales
- Asegúrate que el firewall permite la conexión
-
Problemas con migraciones:
- Elimina la carpeta Migrations si es necesario
- Ejecuta
dotnet ef database drop --force - Vuelve a crear las migraciones
-
Errores de timestamp:
- El DbContext ya incluye la configuración necesaria para PostgreSQL
- Si persisten problemas, verifica la zona horaria del servidor