2014-01-07 7 views
56

Ich habe einen lustigen Effekt mit Migration (EF 5.0) und Code-first (?):Entity Framework Code-first: Migration schlägt mit Update-Datenbank, unnötiges zwingt Add-Migration

Ich habe einige Modelle mit GUID Primärschlüssel. (BTW: Es ist wichtig für mich, dass SQL Server NEWSEQUENTIALID() verwendet, der der Standardwert in der aktuellen Version zu sein scheint)

An einem bestimmten Punkt habe ich Migrationen aktiviert. Ich habe der anfänglichen Migration einen Code hinzugefügt, der bei Bedarf meistens .Index() ist.

Wenn ich die Datenbank und Call-Update-Datenbank löschen, erhalte ich folgende Fehlermeldung:

Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration. You can use the Add-Migration command to write the pending model changes to a code-based migration.

ich AutomaticMigrationsEnabled = true versucht, die ohne Änderung oder Hinzufügen von etwas gearbeitet!

Aber da ich nicht AutomaticMigrationsEnabled will, habe ich auch versucht, die Datenbank wieder zu löschen, update-database genannt und dann add-migration. Am Ende kam eine zusätzliche Migration, die nichts zu ändern scheint (siehe unten). Ich habe auch versucht, diese Zeilen am Ende der ersten Migration hinzuzufügen - aber das ändert nichts.

Eines der Modelle:

[Table(Speaker.TABLENAME)] 
public class Speaker : BaseModel 
{ 
    public const String TABLENAME = "Speaker"; 

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 

    [Required] 
    [MaxLength(50, ErrorMessage = "Name must be 50 characters or less")] 
    public string Name { get; set; } 
} 

Der anfängliche Code-Migration:

public partial class InitialCreate : DbMigration 
{ 
    public override void Up() 
    { 
     // [...] 
     CreateTable(
      "dbo.Speaker", 
      c => new 
       { 
        Id = c.Guid(nullable: false, identity: true), 
        Name = c.String(nullable: false, maxLength: 50), 
       }) 
      .PrimaryKey(t => t.Id) 
      .Index(t => t.Name, true, false); // added manually: unique Name 
     // [...] 
    } 
} 

internal sealed class Configuration : DbMigrationsConfiguration<MyProject.Repositories.DBContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
    } 

    protected override void Seed(MyProject.Repositories.DBContext context) 
    { 
     // ... 
    } 
} 

Unten ist der Code von Add-Migration erstellt: Es scheint nicht, etwas Neues zu tun - vielleicht bin ich etwas vermissen?

Also bin ich neugierig: Was habe ich getan, um Migrationen zu desorientieren? Und was kann ich tun, damit es mit nur einer ersten Migration funktioniert?

Lösung: Die folgende Problemumgehung hat es für mich: 1. löschte ich die Datenbank und alle Migrationen wie hier decribed: https://stackoverflow.com/a/11679386/3168401 2. Enable-Migrations + Add-Migration meiner handgemachten Initial 3. Zusammengeführt ausgeführt .Index() ändert sich in die Datei. Jetzt funktioniert Update-Datenbank wieder - auch mehrfach beim Löschen der Datenbank.

Antwort

83

I also tried deleting the database again, called update-database and then add-migration. I ended up with an additional migration that seems not to change anything (see below)

Basierend auf obigen Angaben, ich glaube, Sie zuerst letzte, was getan haben. Wenn Sie Update database vor Add-migration ausführen, aktualisiert es die Datenbank nicht mit Ihren Migrationsschemas. Zuerst müssen Sie die Migration hinzufügen und dann den Befehl update ausführen.

Probieren Sie sie in dieser Reihenfolge mit der Paketmanagerkonsole aus.

PM> Enable-migrations //You don't need this as you have already done it 
PM> Add-migration Give_it_a_name 
PM> Update-database 
+2

Vielleicht irre ich mich in diesem Punkt, aber ich möchte in der Lage sein, die Datenbank bei Bedarf neu zu erstellen. Führt die anfängliche Migration nicht genau dazu? Bevor ich auf den oben beschriebenen Effekt gestoßen bin, funktionierte die Erstellung der Datenbank mit update-database einwandfrei. Und sobald ich den Migrationsschritt "kid of blank" hinzufüge, funktioniert es auch. –

+0

Wenn keine Datenbank vorhanden ist, wird mit dem Befehl zum Aktualisieren der Datenbank die Datenbank neu erstellt und auch mit verfügbaren Migrationen aktualisiert. Wenn Sie die Datenbank aktualisieren müssen, müssen Sie zunächst 'add-migration' durchführen und' update database' ausführen, um diese Änderungen hinzuzufügen. – Kaf

+0

Ich bin neugierig zu wissen, warum die "nutzlose" Migration in erster Linie hinzugefügt wird. –

9

Entity Framework hat einige Probleme mit Identitätsfeldern.

You can't add GUID identity on existing table

Migrations: does not detect changes to DatabaseGeneratedOption

Reverse engineering does not mark GUID keys with default NEWSEQUENTIALID() as store generated identities

Kein von diesen beschreiben Ihr Problem genau und Down() -Methode in Ihrer persönlichen Migration ist interessant, weil es zu versuchen, scheint IDENTITY aus der Säule zu entfernen Wenn Ihre CREATE TABLE in der anfänglichen Migration erscheint, wird sie gesetzt!

Außerdem, wenn Sie Update-Database -Script oder Update-Database -Verbose verwenden, um die SQL anzuzeigen, die von diesen AlterColumn Methoden ausgeführt wird, werden Sie sehen, dass die SQL in Up und Down identisch ist, und tatsächlich tut nichts.IDENTITY bleibt unverändert (für die aktuelle Version - EF 6.0.2 und darunter) - wie in den ersten beiden Ausgaben beschrieben, die ich verlinkt habe.

Ich denke, Sie sollten den redundanten Code in Ihrer zusätzlichen Migration löschen und mit einer leeren Migration für jetzt leben. Und Sie können sich für die zu behandelnden Themen anmelden/abstimmen.

Referenzen:

Change IDENTITY option does diddly squat

Switch Identity On/Off With A Custom Migration Operation

+0

Vielen Dank für diese Hinweise! Ich werde diese Probleme auffrischen. Im Moment könnte ich mein Problem umgehen, indem ich den Ordner wochole migration, die Datenbank lösche und neustarte: Enable-Migrations, add-migration, dann habe ich wieder meine .Index() hinzugefügt. Dies scheint zu funktionieren. –

Verwandte Themen