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.
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. –
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
Ich bin neugierig zu wissen, warum die "nutzlose" Migration in erster Linie hinzugefügt wird. –