This document describes the PostgreSQL integration setup for the JobTracker application.
The JobTracker application has been updated to support PostgreSQL as the primary database for development and production environments, while maintaining backward compatibility with in-memory databases for testing.
- File:
docker-compose.yml - Purpose: Provides a PostgreSQL database container for local development
- Database: PostgreSQL 15 Alpine
- Connection Details:
- Host: localhost
- Port: 5432
- Database: jobtracker
- Username: jobtracker
- Password: jobtracker_dev_password
- Package Added:
Npgsql.EntityFrameworkCore.PostgreSQL(version 8.0.10) - Configuration: Updated
Program.csto use PostgreSQL for non-testing environments - Environment Detection: Automatically switches to in-memory database when environment is "Testing"
- Configuration: Added to
appsettings.json - Connection String:
Host=localhost;Database=jobtracker;Username=jobtracker;Password=jobtracker_dev_password
- Package Added:
Testcontainers.PostgreSql(version 3.10.0) - Fallback Mechanism: Tests use PostgreSQL test containers when Docker is available, otherwise fall back to in-memory database
- Isolation: Each test class gets its own PostgreSQL container instance when using Testcontainers
-
Start PostgreSQL Database:
docker-compose up -d
-
Run the Application:
dotnet run --project JobTracker
The application will automatically connect to the PostgreSQL database running in Docker.
Tests automatically detect Docker availability:
- With Docker: Uses PostgreSQL test containers for full integration testing
- Without Docker: Falls back to in-memory database for unit testing
Run tests:
dotnet testUpdate the connection string in production environment configuration:
{
"ConnectionStrings": {
"DefaultConnection": "Host=your-postgres-host;Database=jobtracker;Username=your-username;Password=your-password"
}
}The application uses environment-based database selection:
if (builder.Environment.IsEnvironment("Testing"))
{
// Use InMemory database for testing
options.UseInMemoryDatabase("JobTracker");
}
else
{
// Use PostgreSQL for development and production
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
options.UseNpgsql(connectionString);
}The application uses EnsureCreated() for development simplicity. For production environments, consider using Entity Framework migrations:
dotnet ef migrations add InitialCreate
dotnet ef database updateMicrosoft.EntityFrameworkCore(8.0.10)Microsoft.EntityFrameworkCore.InMemory(8.0.10)Microsoft.EntityFrameworkCore.Relational(8.0.10)Microsoft.EntityFrameworkCore.Design(8.0.10)Npgsql.EntityFrameworkCore.PostgreSQL(8.0.10)
Microsoft.EntityFrameworkCore.InMemory(8.0.10)Npgsql.EntityFrameworkCore.PostgreSQL(8.0.10)Testcontainers.PostgreSql(3.10.0)
- Production-Ready: PostgreSQL provides robust data persistence and scalability
- Development Consistency: Same database technology used across all environments
- Test Reliability: Tests run against actual PostgreSQL when available, ensuring database-specific behavior is tested
- Flexibility: Graceful fallback to in-memory database when Docker is unavailable
- Isolation: Each test gets a fresh database instance, preventing test interference
If Docker is not running or available, tests will automatically fall back to in-memory database. This ensures the test suite can run in any environment.
- Verify PostgreSQL container is running:
docker ps - Check container logs:
docker logs jobtracker-postgres - Verify connection string in
appsettings.json
- Ensure sufficient disk space for test containers
- Check Docker daemon is running
- Verify no port conflicts (port 5432)
- Migrations: Implement Entity Framework migrations for production deployments
- Connection Pooling: Configure connection pooling for high-load scenarios
- Read Replicas: Support for read replica databases for scaling read operations
- Backup Strategy: Implement automated backup procedures for production