Sto cercando di scrivere codice per trasferire i dati da un'applicazione a una nuova versione dell'applicazione.
Sia la vecchia che la nuova applicazione utilizzano SQL Server. Il vecchio database è mal progettato in 2 aree principali: non fa un uso corretto delle chiavi esterne e ha tabelle aggiuntive che non sono necessarie (ad esempio, ma non solo, vengono utilizzate le tabelle di ricerca in cui dovrebbe essere usato un enumerazione ).
Credo che il modo "corretto" per farlo sarebbe utilizzare SSIS, tuttavia non ho esperienza con questo e ho faticato a capire come impostare esattamente, quindi sto pensando a una soluzione basata su codice (esegui un'applicazione console una volta).
Ho intenzione di raggiungere questo obiettivo usando Entity Framework poiché mi sento a mio agio nell'usare EF, ed è facile da configurare.
Il nocciolo del problema è mantenere le relazioni e sto cercando indicazioni sul modo migliore per mantenere i dati correlati. Ad esempio, il cliente ha molti indirizzi, l'indirizzo ha l'ID cliente.
Se fosse così semplice potrei semplicemente interrogare i clienti, .Include (x => x.Address) e usarlo per aggiungere i clienti al nuovo database (creando automaticamente nuovi ID nel database di destinazione lungo la strada). Tuttavia, dato che ci sono alcune tabelle (~ 30) tutte collegate in un modo o nell'altro, ognuna con molte righe di dati, ritengo che ciò sarebbe disordinato e piuttosto intenso dato che i dati dovrebbero probabilmente essere caricati in memoria in un colpo (dato che dovrei anche trasformare i dati).
Un'alternativa sarebbe quella di SET IDENTITY INSERT e copiare le tabelle una per una, mantenendo i vecchi Ids nelle nuove tabelle, ma questo sembra sbagliato.
Oltre a mandarmi su un corso SSIS, ci sono altre alternative?
SSIS è più adatto alla trasformazione di dati da diverse fonti / destinazioni. Se entrambi i database utilizzano SQL Server, analizzerei la migrazione della struttura della tabella esclusivamente tramite query SQL. EF è possibile, ma sarà più lento e più dispendioso in termini di risorse, specialmente se non viene eseguito sul server del database stesso. (dati sul filo e sul retro)
Ad esempio, ho avuto una tabella correlata a una tabella di ordini tramite un "OrderNumber" che desidero migrare per utilizzare OrderId con un FK. Strutturo la mia nuova tabella per includere un OrderId come Nullable e includo anche il numero di ordine, in genere con un carattere di sottolineatura finale per ricordare che la colonna verrà eliminata. Importo i dati con i numeri di ordine diretti alla colonna temporanea, quindi eseguo un secondo passaggio per aggiornare l'OrderId. Dopo un controllo di integrità verifica che tutti gli OrderId siano tutti contabilizzati (nessun valore null rimanente) quindi la colonna OrderId può essere resa non annullabile, stabilire i FK e i vincoli e rilasciare la colonna OrderNumber_ in più. Quando si eseguono queste modifiche, in genere è meglio impostare le tabelle senza vincoli / indici, quindi crearle dopo il porting dei dati. (Più veloce, ma vuoi essere ragionevolmente sicuro che i tuoi dati vengano visualizzati correttamente e completamente) Rompere la struttura dei dati proposta e trasferirli / riassociarli una tabella alla volta prima di finalizzare i nuovi FK. Le tabelle temporali possono essere utilizzate anche per scenari difficili. Tutto ciò può essere eseguito su un backup ripristinato come proof of concept, scriptato e configurato per essere eseguito su un server di produzione di backup una volta che sei felice che sia completo e testato.
Avere tabelle di ricerca combinate con un'enumerazione di supporto sarebbe meglio che eliminare la tabella di ricerca. I valori con FK per le tabelle di ricerca aiutano a rafforzare l'integrità referenziale a livello di DB e aiutano a fornire un significato ai valori arbitrari quando vengono interrogati. In genere, le tabelle di ricerca suffisso associate all'enumerazione con "Enum" indicano che queste tabelle sono governate dal codice e devono essere di sola lettura. È anche possibile impostare i trigger Inserisci / Aggiorna / Elimina per impedire modifiche a queste tabelle. (che gli script di aggiornamento possono disabilitare e ristabilire quando è necessario espandere l'enumerazione)