Ich habe einen lustigen Effekt mit Migration (EF 5.0) und Code-First:
Ich habe einige Modelle mit GUID-Primärschlüsseln erstellt. (Übrigens: Es ist wichtig für mich, dass SQL Server verwendet NEWSEQUENTIALID()
, was in der aktuellen Version der Standardwert zu sein scheint.)
Irgendwann habe ich Migrationen aktiviert. Ich habe der anfänglichen Migration etwas Code hinzugefügt, dies ist meistens .Index()
nach Bedarf.
Wenn ich die Datenbank lösche und update-database aufrufe, wird folgende Fehlermeldung angezeigt:
Die Datenbank kann nicht aktualisiert werden, um mit dem aktuellen Modell übereinzustimmen, da Änderungen ausstehen und die automatische Migration deaktiviert ist. Schreiben Sie entweder die ausstehenden Modelländerungen in eine codebasierte Migration oder aktivieren Sie die automatische Migration. Setzen Sie DbMigrationsConfiguration.AutomaticMigrationsEnabled auf true, um die automatische Migration zu aktivieren. Mit dem Befehl Add-Migration können Sie die ausstehenden Modelländerungen in eine codebasierte Migration schreiben.
Ich habe es versucht AutomaticMigrationsEnabled = true
, was funktioniert hat, ohne etwas zu ändern oder hinzuzufügen!
Aber da ich nicht will AutomaticMigrationsEnabled
, habe ich auch versucht, die Datenbank erneut zu löschen, aufgerufen update-database
und dann add-migration
. Am Ende hatte ich eine zusätzliche Migration, die anscheinend nichts ändert (siehe unten). Ich habe auch versucht, diese Zeilen am Ende der anfänglichen Migration hinzuzufügen - dies ändert jedoch 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 Migrationscode:
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, der durch Add-Migration erstellt wurde: Er scheint nichts Neues zu bewirken - vielleicht fehlt mir etwas?
public partial class UnneccessaryMigration : DbMigration
{
public override void Up()
{
// isn't this the exact same code from InitialMigrations?
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false, identity: true));
// ...
}
public override void Down()
{
//...
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false));
}
}
Ich bin also 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 getan:
- Ich habe die Datenbank und alle hier beschriebenen Migrationen gelöscht: https://stackoverflow.com/a/11679386/3168401
- Enable-Migrations + Add-Migration Initial ausgeführt
- Meine handgemachten .Index () Änderungen wurden in die Datei eingefügt. Jetzt funktioniert Update-Database wieder - auch wiederholt beim Löschen der Datenbank.