7

Questa è una lunga domanda, ma sarei molto grato se riuscirò a ottenere qualche buon consiglio su questo. In breve, sto cercando un buon approccio per l'aggiornamento della versione dello schema del database MS SQL che richiede anche il trasferimento dei dati da tabelle eliminate a nuove tabelle.Come evitare la perdita di dati con il modello EF Primo aggiornamento dello schema del database?

Penso Stack Overflow è il luogo più adatto per questa domanda (non dba.stackexchange.com), perché al suo interno, questo è un problema per gli sviluppatori .NET che utilizzano Entity Framework, e le parti di database di questo consiste principalmente di script sql generati automaticamente.


Sfondo

Un'applicazione .NET e database SQL è in esecuzione in Azure (L'applicazione in ruoli dei lavoratori e il database in SQL Azure). Fino ad ora, gli aggiornamenti della versione hanno funzionato bene, perché tutte le modifiche allo schema del database sono state semplici (come l'aggiunta di una nuova colonna). Tuttavia, d'ora in poi devo anche occuparmi dello spostamento dei dati da un tavolo all'altro durante gli aggiornamenti. (Sono in grado di risolvere questo problema temporaneamente creando un nuovo database, generare uno script con i dati dal vecchio database e modificare manualmente lo script per adattarlo al nuovo schema, ma spero che ci sia un approccio migliore).

Uso Entity Framework e utilizzo Model First. Entità e associazioni sono definite in Visual Studio Data Model Designer e questo approccio è molto appropriato per la mia applicazione.

Io uso un dacpac per aggiornare il database SQL di Azure e questo approccio ha funzionato bene fino ad ora (ma ora avrò perdite di dati, quindi ora devo trovare un modo per spostare i dati in nuove tabelle).

Spero di poter continuare a utilizzare il framework di entità e definire entità/associazioni nella finestra di progettazione, ma è opportuno passare dall'aggiornamento di dacpac a un'altra tecnologia, se necessario.

metodo di aggiornamento fino ad ora

  1. aggiungo nuove entità (tabelle), associazioni (relazioni) e proprietà (colonne) nella finestra di progettazione.
  2. I clic destro, selezionare "Genera database dal modello ..." e questo risulta in uno script .sql che elimina i vecchi oggetti di database e crea i nuovi oggetti di database.
  3. Creo un database vuoto ed eseguo lo script per creare le tabelle/chiavi ecc.
  4. In SQL Server Management Studio, faccio clic con il pulsante destro del mouse sul database e seleziona "Attività -> Estrai applicazione livello dati ...". Al termine della procedura guidata, ricevo il dacpac di cui ho bisogno (in realtà ora posso eliminare il database, poiché l'ho creato solo per poter ottenere il file dacpac, poiché non penso di poterlo generare in Visual Studio Data Model Designer) .
  5. Faccio clic con il pulsante destro del mouse sul database SQL di Azure e seleziono "Attività -> Aggiorna applicazione livello dati ..." e seguo la procedura guidata. Fino ad ora non ho mai avuto perdite di dati, quindi questo ha funzionato bene!

Situazione attuale

Questo è un esempio semplificato per illustrare il problema, ma mi metterò in situazioni quasi identiche abbastanza spesso d'ora in poi a quanto pare. Guarda la vecchia e la nuova versione dello schema nella figura sottostante. Supponiamo che ci siano già dati nel database. Ho bisogno dei dati in ImageFile per finire in ImageFileOriginal o ImageFileProcessed a seconda del valore booleano/bit di IsOriginal. Usando "Aggiorna applicazione livello dati" ricevo avvisato della perdita di dati. Quale approccio consiglieresti per affrontare questo?Come ho detto prima, va bene passare dall'aggiornamento di dacpac a un'altra tecnologia se necessario.

Old schema New schema

Ho letto su Progetti di database di Visual Studio, Fluent Migrator, Red Gate e Entity Designer Database Generation Power Pack (Non supporta Visual Studio 2012), ma non ho trovato una buon modo per questo Ammetto che non ho passato un'intera giornata a scavare in ogni tecnologia, ma ho certamente impiegato del tempo per cercare di trovare un buon approccio.

risposta

0

Nella classe Configuration impostare il costruttore come di seguito:

public Configuration() 
{ 
    AutomaticMigrationsEnabled = true; 
    AutomaticMigrationDataLossAllowed = false; 
} 

Impostare la proprietà AutomaticMigrationEnabled a true significa che stiamo usando automatica di codice prima migrazione e un'altra proprietà AutomaticMigrationDataLossAllowed è impostato su false, significa che durante la migrazione dei dati esistenti non viene perso da che la migrazione della tabella del database.

L'intera classe Configuration è la seguente.

Problemi correlati