Il nostro team sta pensando di utilizzare il codice Entity Framework Core per aiutare a modellare il database. Possiamo avere sia progetti DB che modelli EF, come da articolo qui Database Projects vs. Entity Framework Database Migrations che utilizza lo schema comparativo, solo cercando di capire quale sarà la fonte della verità?
Entity Framework supporta tutte le funzionalità nei progetti di database SSDT di SQL Server?
Quali caratteristiche EF Core 2 non supporta? (ad esempio, non supporta nessuno dei seguenti: trigger, viste, funzioni, stored procedure, chiavi di crittografia, certificati, proprietà db (ansi null, identificatore quotato), partizioni)
Sto cercando di individuare la risorsa Microsoft.
tl; dr I progetti di database sono ricchi di funzionalità, ma prima del database. Le migrazioni sono in codice, ma hanno un set integrato di funzionalità del database molto limitato.
Per molte persone non sarà rilevante confrontare progetti di database e migrazioni. Rappresentano due diverse modalità di lavoro con Entity Framework. Le migrazioni sono in codice, DP è il database prima. Certo, è possibile utilizzare le migrazioni per controllare lo schema del database e inoltre mantenere un DP sincronizzato con il database generato per soddisfare i DBA (come suggerisce il link). Ma entrambi conducono le loro vite separate e non c'è un'unica fonte di verità .
Quindi confrontarli è utile se non sei ancora sicuro della modalità di lavoro che sceglierai.
Per me la differenza più importante è che DP coprirà tutti gli oggetti del database e rileverà tutte le modifiche tra di loro durante il confronto dei database. Le migrazioni rilevano solo le modifiche tra un database e il modello mappato. E l'insieme di opzioni per la generazione di oggetti di database è molto limitato. Per tutto ciò che serve in aggiunta devi inserire istruzioni SQL nel codice di migrazione. Queste dichiarazioni sono sotto la tua responsabilità. Devi capire da solo se una migrazione ha bisogno di un'istruzione ALTER PROCEDURE
o meno (per esempio). EF non si lamenterà se lo script e il database differiscono da questo punto di vista.
Questo è il motivo principale per cui non sono mai stato un grande fan delle migrazioni. È praticamente impossibile mantenere uno schema di database maturo che includa archiviazione, gruppi di file, privilegi, regole di confronto e cos'hai.
Un altro vantaggio di DP è che sono fantastici in combinazione con il controllo del codice sorgente. Ogni oggetto di database ha il proprio file ed è molto facile controllare la cronologia delle modifiche di ogni singolo oggetto. Questo non è possibile con le migrazioni generate. In effetti, molte modifiche intermedie non possono mai arrivare a una migrazione generata.
Ovviamente l'ovvio vantaggio delle migrazioni è la possibilità di eseguire un controllo di runtime (anche se incompleto) indipendentemente dal fatto che il codice e il database corrispondano. Nei primi progetti di database è necessario creare il proprio meccanismo per questo.
EF Core è solo ORM.
1) Dovresti essere pronto a creare tutti gli oggetti DB tranne le tabelle manualmente. Quello che creo manualmente: costruisce (sia i valori predefiniti che le condizioni). Poiché questo è il primo codice, non è necessario in SP, funzioni e così via. Se si utilizza ORM - DB è solo memoria. Ovviamente la pratica è importante. Per me i vincoli predefiniti aggiungono conforto alle tabelle in cui creo manualmente i dati di test. E le condizioni sono anche utili in situazioni in cui non ti fidi del tuo codice (team).
2) farai la creazione (e l'eliminazione) di viste, trigger, sp e così via al codice di "migrazione" (c'è un tale concetto in EF) in plain sql:
migrationBuilder.Sql("CREATE VIEW ...");
Di conseguenza, potresti avere un programma di "migrazione" separato (ad esempio, lo strumento della riga di comando) che installa o rimuove entrambe le tabelle Ef Core e gli oggetti creati manualmente, esegui e ripristina le migrazioni dei dati.
"Migrazioni EF core" è una API piuttosto complessa (riserva una settimana per l'apprendimento). Argomenti interessanti: gestione di diversi dbcontexts in un db, creazione di oggetti db durante la migrazione da annotazioni modello, unistall. O trovare un libero professionista per questo (questa parte del progetto è buona per l'outsourcing).