Un'istantanea del modello di database viene salvata insieme a ogni migrazione in un file .resx. Quando aggiungi una nuova migrazione, EF confronta il modello di database corrente (generato dalle classi e dalle impostazioni del modello da DbModelBuilder) con l'ultima migrazione e determina le modifiche tra di essi.
Il problema che si sta descrivendo può verificarsi se le migrazioni non sono sincronizzate. Succede a noi se due sviluppatori eseguono due migrazioni indipendenti e queste migrazioni vengono successivamente unite al ramo predefinito.
Esempio:
Sviluppatore 1
migrazione AddColumnA
Sviluppatore 2
migrazione AddColumnB
versione uniti
Migrazione AddColumnA - database di snapshot include Columna
Migrazione AddColumnB - database di snapshot include ColumnB ma non Columna
Se si aggiunge un altro la migrazione, i cambiamenti sono determinati contro la migrazione AddColumnB, quello non contiene informazioni sulla colonnaA. Una soluzione alternativa a questo problema è generare la migrazione fittizia (con i metodi Up e Down vuoti) solo per avere lo snapshot del modello di database corretto nell'ultima migrazione.
versione unita
Migrazione AddColumnA - database di snapshot include Columna
Migrazione AddColumnB - database di snapshot include ColumnB ma non Columna
Migrazione Dummy - snapshot del database con Columna e ColumnB
fonte
2013-10-03 11:28:35
Molto interessante. C'è un modo per impedire che le migrazioni vengano create in base a quel file di risorse, in modo che il database venga utilizzato come riferimento? Questo è un grave inconveniente delle migrazioni a mio parere, poiché desidero davvero avere file di migrazione EXPLICIT anziché solo la migrazione automatica ma non voglio avere numerosi file di migrazione fittizi quando si lavora con più sviluppatori sulla stessa base di codice. –
IMHO non esiste un modo per specificare il database come riferimento.Invece di creare una migrazione fittizia, è possibile aggiornare alla prima migrazione (AddColumnA) e quindi rigenerare la seconda migrazione. I metodi Up e Down rimarranno gli stessi, ma lo snapshot del database verrà aggiornato alla versione corretta e la migrazione fittizia non sarà necessaria. –
Grazie per tutte le informazioni, ma passare da una revisione all'altra per ogni unione è molto più complicato che avere file di migrazione "brutti"/vuoti. Almeno se fai una o più fusioni ogni giorno. –