You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Attualmente l'applicazione usa EnsureCreated() + EnsureDeleted() per gestire il database in sviluppo (Issue #13, PR #96). Questo approccio ricrea il DB se lo schema è obsoleto, eliminando tutti i dati.
Problema: In produzione questo comportamento distruggerebbe i dati utente.
Soluzione: Implementare EF Core Migrations per aggiornare lo schema preservando i dati esistenti.
// App.xaml.cs - InitializeDatabase()try{_=context.ScheduledVisits.Any();// Test schemaDbInitializer.Initialize(context);// Popola se vuoto}catch(SqliteExceptionex)when(ex.Message.Contains("no such table")){context.Database.EnsureDeleted();// 🗑️ DISTRUTTIVO!context.Database.EnsureCreated();DbInitializer.Initialize(context);}
Pro (Dev):
✅ Ricrea DB automaticamente se schema obsoleto
✅ Dati fake sempre disponibili
✅ No migrations complesse in sviluppo
Contro (Prod):
❌ EnsureDeleted() elimina dati utente
❌ EnsureCreated() non supporta schema changes
❌ DbInitializer non dovrebbe girare in prod
✅ Tasks per Produzione
1. Creare Initial Migration
# Da root del progettocd src/PTRP.Data
dotnet ef migrations add InitialCreate --startup-project ../PTRP.App
Genera:
Migrations/YYYYMMDDHHMMSS_InitialCreate.cs
Snapshot dello schema corrente
2. Aggiornare InitializeDatabase() per Produzione
privatevoidInitializeDatabase(){usingvarscope=_serviceProvider.CreateScope();varcontext=scope.ServiceProvider.GetRequiredService<PTRPDbContext>();
#if DEBUG// SVILUPPO: Ricrea se schema obsoletotry{_=context.ScheduledVisits.Any();DbInitializer.Initialize(context);// Dati fake}catch(SqliteExceptionex)when(ex.Message.Contains("no such table")){context.Database.EnsureDeleted();context.Database.EnsureCreated();DbInitializer.Initialize(context);}
#else
// PRODUZIONE: Applica migrations senza perdere daticontext.Database.Migrate();// ✅ Preserva dati esistenti// NO DbInitializer in produzione!// Dati reali importati da ConfigurationService (Issue #49)
#endif
}
3. Workflow Migrations per Schema Changes
Ogni volta che modifichi un Model:
# 1. Modifica PatientModel.cs (esempio: aggiungi proprietà)
public string? Email { get;set; }
# 2. Crea migration
dotnet ef migrations add AddPatientEmail --startup-project ../PTRP.App
# 3. Applica migration (automatico in prod via Migrate())
dotnet ef database update --startup-project ../PTRP.App
Genera SQL:
ALTERTABLE Patients ADD Email TEXTNULL;
4. Gestione Dati Produzione
Primo Deploy (DB vuoto):
Migrate() crea tutte le tabelle (da InitialCreate)
# Test migrations localmente
rm ~/AppData/Local/PTRP/ptrp.db
dotnet run --project src/PTRP.App --configuration Release
# Verifica:# - DB creato con Migrate() invece di EnsureCreated()# - Nessun DbInitializer.Initialize() eseguito# - Schema corretto senza dati fake
📊 Schema Transizione Dev → Prod
DEVELOPMENT (#if DEBUG)
└─ EnsureDeleted() + EnsureCreated()
└─ DbInitializer.Initialize() (dati fake)
└─ Ricrea DB ad ogni schema change
PRODUCTION (#else)
└─ context.Database.Migrate()
└─ NO DbInitializer (dati reali da import)
└─ Schema changes incrementali (preserva dati)
// Fornisci default value o popola primamigrationBuilder.AddColumn<string>(name:"RequiredField",table:"Patients",nullable:false,defaultValue:"Unknown");// 👈 IMPORTANTE!
🎯 Descrizione
Attualmente l'applicazione usa
EnsureCreated()+EnsureDeleted()per gestire il database in sviluppo (Issue #13, PR #96). Questo approccio ricrea il DB se lo schema è obsoleto, eliminando tutti i dati.Problema: In produzione questo comportamento distruggerebbe i dati utente.
Soluzione: Implementare EF Core Migrations per aggiornare lo schema preservando i dati esistenti.
📝 Contesto da Issue #13 e PR #96
Approccio Attuale (Sviluppo)
Pro (Dev):
Contro (Prod):
EnsureDeleted()elimina dati utenteEnsureCreated()non supporta schema changesDbInitializernon dovrebbe girare in prod✅ Tasks per Produzione
1. Creare Initial Migration
Genera:
Migrations/YYYYMMDDHHMMSS_InitialCreate.cs2. Aggiornare
InitializeDatabase()per Produzione3. Workflow Migrations per Schema Changes
Ogni volta che modifichi un Model:
Genera SQL:
4. Gestione Dati Produzione
Primo Deploy (DB vuoto):
Migrate()crea tutte le tabelle (da InitialCreate)ConfigurationService(Issue FASE 1 - Foundation: Schermata Primo Avvio (First Run Setup) #49)Deploy successivi (DB popolato):
Migrate()applica solo nuove migrationsNULLo default values5. Testing Strategy
📊 Schema Transizione Dev → Prod
📝 Documentazione da Creare
docs/migrations-guide.mdAggiornare
README.mdAggiungere workflow CI/CD
Esempi comuni:
Rinominare colonna:
Cambiare tipo colonna:
Aggiungere constraint NOT NULL:
🔗 References
✅ Acceptance Criteria
#if DEBUG / #elseimplementato inInitializeDatabase()Migrate()invece diEnsureCreated()docs/Priority: Low (implementare prima del primo deploy produzione)
Milestone: Pre-Production
Labels: enhancement, documentation, database