Sie erhalten die Art Zusammenstoß Fehler, da die erzeugte Migration direkt ALTER COLUMN
auf den betroffenen Spalten zu tun versucht, den Typ Guid
-integer
zu ändern, und es ist nicht möglich, da die Guid
Werte nicht implizit auf integer
Werte umgewandelt werden.
Sie müssen Ihre Migration manuell ändern. Entfernen Sie die AlterColumn
Zeilen. Um Ihre bestehenden Kurs-IDs ohne Datenverlust zu migrieren, können Sie die vorhandenen Guid
Spalten vorübergehend umbenennen (Suffix _Old
hinzufügen), neue Spalten mit dem richtigen neuen Namen und Typ erstellen, den Inhalt der Beziehungstabelle mit den richtigen Werten füllen UPDATE
mit einem SELECT
und löschen schließlich die alten Spalten:
public override void Up()
{
DropForeignKey("dbo.GroupCourses", "Course_Id", "dbo.Courses");
DropIndex("dbo.GroupCourses", new[] { "Course_Id" });
DropPrimaryKey("dbo.Courses");
DropPrimaryKey("dbo.GroupCourses");
//Removed: AlterColumn("dbo.Courses", "Id", c => c.Int(nullable: false, identity: true));
RenameColumn("dbo.Courses", "Id", "Id_Old"); //Added
AddColumn("dbo.Courses", "Id", c => c.Int(nullable: false, identity: true)); //Added
//Removed: AlterColumn("dbo.GroupCourses", "Course_Id", c => c.Int(nullable: false));
RenameColumn("dbo.GroupCourses", "Course_Id", "Course_Id_Old"); //Added
AddColumn("dbo.GroupCourses", "Course_Id", c => c.Int(nullable: false)); //Added
Sql(@"UPDATE gc SET gc.Course_Id = c.Id "
+ "FROM dbo.GroupCourses as gc "
+ "INNER JOIN dbo.Courses as c ON gc.Course_Id_Old = c.id_Old"); //Added
DropColumn("dbo.GroupCourses", "Course_Id_Old"); //Added
DropColumn("dbo.Courses", "Id_Old"); //Added
AddPrimaryKey("dbo.Courses", "Id");
AddPrimaryKey("dbo.GroupCourses", new[] { "Group_Id", "Course_Id" });
CreateIndex("dbo.GroupCourses", "Course_Id");
AddForeignKey("dbo.GroupCourses", "Course_Id", "dbo.Courses", "Id", cascadeDelete: true);
}
ich im Code markiert die Linien I mit den Kommentaren //Added
und //Removed
geändert. Der Rest des Codes ist der Originalcode der Migration, der mit Add-Migration
generiert wurde, nachdem der Eigenschaftstyp im Modell in int
geändert wurde.
Sie müssen nur die Werte in der Spalte in der Beziehungstabelle mit UPDATE
füllen. Die Werte in der Spalte Courses.Id
werden automatisch generiert, da es sich um eine identity
Spalte handelt.
Sie sollten auch herausfinden, die Down()
Methode und implementieren Sie den umgekehrten Prozess, oder lassen Sie es so, wie es ist, wenn Sie wirklich nie Downgrade der Datenbank auf eine vorherige Migration.
Sie können dies auch tun, indem Sie den Code zwischen der Migration und dem Seeder aufteilen. Es wäre konzeptionell korrekter, da Sie die Migrationen für Schemaänderungen und den Seeder für Datenänderungen verwenden sollten. Aber ich denke, dass es einfacher ist, und Sie brauchen nur eine Migration, während Sie mit dem Seeder-Ansatz zwei Migrationen benötigen: eine mit dem gesamten obigen Code mit Ausnahme der UPDATE
und die Sätze, die die _Old
Spalten fallen lassen, und eine andere einfach mit dem Fallenlassen der _Old
Spalten. Der UPDATE
Teil wäre in der Sämaschine implementiert.
Eine Warnung: Der SQL-Code im UPDATE
-Satz funktioniert mit Sql Server
, funktioniert aber möglicherweise nicht mit anderen Datenbank-Engines. Es ist ein weiterer Nachteil der Verwendung der Migration anstelle der Sämaschine.
Können Sie eine Migration durchführen, um einen CourseTemp hinzuzufügen, der alle Daten aus Ihrer alten Course-Tabelle mit der 'Seed()' Methode in den Temp hochlädt? Dann könnten Sie eine andere Migration durchführen, um den Original-Kurs zu löschen und die CoureseTemp-Klasse/-Tabelle umzubenennen? – Bwolfing