19

ho:EF 5. "Migrazione automatica non è stata applicata perché si tradurrebbe in una perdita di dati" - ha cambiato solo il nome della colonna

AutomaticMigrationsEnabled = True 
AutomaticMigrationDataLossAllowed = False 

nel mio file di configurazione e il modello esistente è:

Public Property ID() As Integer 
Public Property ERP_ArticleCode() As String 
Public Property description() As String 

Tutto quello che ho fatto è stato cambiare la 3a colonna da "descrizione" a "am_description" e ho eseguito "update-database -verbose" che ha provocato "La migrazione automatica non è stata applicata perché avrebbe comportato una perdita di dati"!

Non capisco questo ... perché non posso semplicemente modificare il nome di una colonna e aggiornare il database? Questo non dovrebbe essere un problema di dataloss, dovrebbe? Sto facendo qualcosa di sbagliato?

+0

come saprebbe che si sta cambiando la colonna e non eliminarla e aggiungerne una nuova? –

+0

Commento equo. Quindi l'unico modo per risolvere questo problema è cambiare manualmente il metodo "su" e renderlo "alter column" invece di "delete" e "add"? – TheMook

risposta

17

È necessario modificare il metodo su e giù e sostituire le istruzioni AddColumn e DropColumn con RenameColumn.

EF non può rilevare se si sta rinominando una colonna o se si desidera eliminarne una e crearne una nuova.

+2

Se si utilizza SQL Server Compact, questo non funzionerà. "La ridenominazione diretta delle colonne non è supportata da SQL Server Compact.Per rinominare una colonna in SQL Server Compact, sarà necessario ricrearla. " –

33

Questo codice qui sotto non è necessario eseguire la migrazione:

AutomaticMigrationsEnabled = True 
AutomaticMigrationDataLossAllowed = False 

E, di tronchi con a questo articolo (from entityframework codeplex), questo è un errore EF ed è possibile ignorare questo con -Force attributo nella migrazione.

Update-Database -Force 

o

Update-Database -TargetMigration: X -Force 

Dovrebbe risolvere il problema.

IMO, dovresti lasciare che EF decida cosa fa con le tue colonne, solo la mia opinione.

+4

Sei veramente e veramente ** ignora ** l'errore con -Force o AutomaticMigrationDataLossAllowed = True. Questa è una cosa * molto * pericolosa da inserire nel codice che raggiungerà la produzione. Sii * sicuro * di voler ignorare il problema, in quanto potresti perdere i dati di produzione se non stai attento. –

+0

@EricJ. ha ragione su questo, devi stare attento con quei codici e NON promuovere la produzione senza sapere cosa stai facendo. –

2

ho risolto in questo modo, tipo solo:

-Force Update-Database

+9

Ma tutto ciò che fa è forzare la perdita di dati! Non affronta il motivo per cui il framework dell'entità pensa che ci debba essere la perdita di dati, che è chiaramente spiegato da kirsten g sopra. Semplicemente sovrascrivere e forzare il database ad aggiornare e perdere i dati non è uno scenario ideale per la maggior parte avrei comunque. – TheMook

-5

Devi cambiare la linea

AutomaticMigrationDataLossAllowed = False 

a

AutomaticMigrationDataLossAllowed = True 

Nota: t fare attenzione ad usare true solo nel proprio ambiente di sviluppo in quanto può causare la perdita di dati dopo la distribuzione per la produzione.

+1

No. Questo è proprio come per la risposta di mejaiamanuel57 sopra. Forzare il database a rilasciare i dati è NASCONDERE il problema, non risolvendolo, Kirsten G ha spiegato perfettamente la situazione, questo non può essere gestito automaticamente, richiede l'intervento dell'utente nel codice EF e al posto di "RenameColumn". – TheMook

Problemi correlati