5

Domanda: Esiste un'impostazione per essere avvisati della perdita involontaria di dati durante l'esecuzione di uno script di migrazione.Codice EF 6 Prima le migrazioni avvisano o impediscono aggiornamenti distruttivi

Ho utilizzato le migrazioni prima del codice dal 4.1, ma mentre sperimentavo un progetto di test mi sono imbattuto in un comportamento che non mi aspettavo. Forse non ho mantenuto le nuove funzionalità.

dire che ho un modello semplice:

public class Customer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Address { get; set; } 
    public string City { get; set; } 
} 

e il contesto:

public class CustContext : DbContext 
{ 
    public CustContext() : base("DefaultConnection") { } 
    public DbSet<Customer> Customers { get; set; } 
} 

ho già attivato le migrazioni, creato la migrazione iniziale, aggiornato il database come segue, quindi popolato la tabella con dati.

enable-migrations 
add-migration initial 
update-database 

Poi ho cambiato il nome di Indirizzo per homeAddress. Questo è lo script di migrazione:

add-migration HomeAddress 

    public partial class HomeAddress : DbMigration 
{ 
    public override void Up() 
    { 
     AddColumn("dbo.Customers", "HomeAddress", c => c.String()); 
     DropColumn("dbo.Customers", "Address"); 
    } 

    public override void Down() 
    { 
     AddColumn("dbo.Customers", "Address", c => c.String()); 
     DropColumn("dbo.Customers", "HomeAddress"); 
    } 
} 

Questo è lo script di configurazione:

internal sealed class Configuration : DbMigrationsConfiguration<CodeFirstMigrations.Model1.CustContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     AutomaticMigrationDataLossAllowed = false; 
    } 

    protected override void Seed(CodeFirstMigrations.Model1.CustContext context) 
    { 

    } 
} 

Quando ho eseguito il comando update-base di dati, mi aspettavo di ottenere un errore sulla falsariga di "Impossibile completare la migrazione perché comporterebbe una perdita di dati ... "In realtà vedo che quell'errore funziona molto sul mio progetto.

Ma invece ha abbandonato felicemente la colonna Indirizzo (popolata) e ha creato una nuova colonna IndirizzoIndirizzo.

Ho pensato che ci doveva essere un'impostazione di configurazione per controllare quel comportamento, ma tutto quello che ho trovato era AutomaticMigrationDataLossAllowed che apparentemente si applica solo alle migrazioni automatiche.

Ho trascurato qualcosa?

+0

AutomaticMigrationDataLossAllowed sta facendo esattamente ciò che significa, penso di essere un po 'confuso. –

+0

AutomaticMigrationDataLossAllowed = False non modifica nulla nello scenario che ho descritto, perché non si tratta di migrazioni automatiche – Joel

+0

Quali sono le impostazioni di migrazione? –

risposta

4

Questo problema è stato già sollevato come problema, ma è stato rifiutato come "in base alla progettazione".

Deciso che questo è di progettazione - si avvisano solo per le migrazioni automatiche con perdita di dati.

Vedere l'errore here.

+2

questo è abbastanza insoddisfacente, ma suppongo che debba contare come una risposta corretta. :) – Joel

0

È possibile utilizzare:

public partial class HomeAddress : DbMigration 
{ 
    public override void Up() 
    { 
     AddColumn("dbo.Customers", "HomeAddress", c => c.String()); 
     Sql("UPDATE "dbo.Customers" SET HomeAddress = Address"); 
     DropColumn("dbo.Customers", "Address"); 
    } 

    public override void Down() 
    { 
     AddColumn("dbo.Customers", "Address", c => c.String()); 
     DropColumn("dbo.Customers", "HomeAddress"); 
    } 
} 

Poi di salvare i dati.