2013-10-02 16 views
19

Sono di fronte a un problema strano con le migrazioni prima del codice in Entity Framework versione 5. Talvolta Update-Database non riesce a causa di modifiche in sospeso ma il comando Add-Migration produce solo migrazioni con modifiche al database già contenute nelle ultime migrazioni e il database è aggiornato. Quindi mi aspetterei che la nuova migrazione sia vuota.Perché Add-Migration talvolta crea migrazioni duplicate?

In che modo Add-Migration rileva quali modifiche sono dovute? Non sembra utilizzare il database come fonte.

risposta

35

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

+1

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. –

+2

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. –

+0

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. –

Problemi correlati