5

Frage: Gibt es eine Einstellung, die vor versehentlichem Datenverlust beim Ausführen eines Migrationsskripts gewarnt werden soll?EF 6 Code Erste Migrationen warnen vor oder verhindern zerstörerische Updates

Ich habe Code-Migrationen seit 4.1 verwendet, aber während ich in einem Testprojekt experimentierte, lief ich in Verhalten, das ich nicht erwartet hatte. Vielleicht habe ich die neueren Funktionen nicht beibehalten.

sagen, dass ich ein einfaches Modell haben:

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

und Kontext:

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

Ich habe bereits Migrationen aktiviert ist, erstellt die erste Migration, die Datenbank aktualisiert, wie folgt, dann die bevölkerten Tabelle mit Daten.

enable-migrations 
add-migration initial 
update-database 

Dann änderte ich den Namen Adresse homeaddress. Dies ist das Migrationsskript:

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"); 
    } 
} 

Dies ist das Konfigurationsskript:

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

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

    } 
} 

Wenn ich den Update-Datenbank Befehl ausgeführt wird, habe ich voll einen Fehler erhalten entlang der Linien von „erwarten konnte nicht abgeschlossen werden die Migration, weil es zu Datenverlust führen würde ... "Ich sehe diesen Fehler tatsächlich viel an meinem eigenen Projekt.

Aber stattdessen wurde die Adresszeile erfolgreich gelöscht und eine neue Spalte HomeAddress erstellt.

Ich dachte, dass es eine Konfigurationseinstellung geben muss, um dieses Verhalten zu steuern, aber alles, was ich finden konnte, war AutomaticMigrationDataLossAllowed, die anscheinend nur für automatische Migrationen gilt.

Habe ich etwas übersehen?

+0

AutomaticMigrationDataLossAllowed tut genau das, was es bedeutet, ich denke, ich bin ein bisschen verwirrt. –

+0

AutomaticMigrationDataLossAllowed = False ändert nichts in dem von mir beschriebenen Szenario, da dies keine automatischen Migrationen sind. – Joel

+0

Was sind Ihre Migrationseinstellungen? –

Antwort

4

Dies wurde bereits als Problem angesprochen, aber als "per Design" abgelehnt.

Entschieden ist das Design - wir warnen nur für automatische Migrationen mit Datenverlust.

Siehe den Fehler here.

+2

Das ist ziemlich unbefriedigend, aber ich nehme an, es muss als eine richtige Antwort gelten. :) – Joel

0

können Sie verwenden:

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"); 
    } 
} 

Sie dann Ihre Daten speichern.

Verwandte Themen