発生した移行がinteger
へGuid
からタイプを変更するには、影響を受けた列に直接ALTER COLUMN
行おうとし、Guid
値が暗黙的にinteger
値に変換することができないので、それができないため、あなたはタイプの衝突エラーが表示されます。
移行を手動で変更する必要があります。 AlterColumn
行を削除します。データ損失なしで既存のコースIDを移行するには、既存のGuid
列の名前を変更して(接尾辞_Old
を追加)、正しい新しい名前とタイプの新しい列を作成し、関係テーブルの内容をSELECT
とUPDATE
、そして最終的に古い列を削除:私はコードで私がコメント//Added
と//Removed
で変更された行をマークし
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);
}
を。残りのコードは、モデル内でプロパティタイプをint
に変更した後にAdd-Migration
で生成された移行の元のコードです。
UPDATE
の値を記入する必要があるのは、関係テーブルの列の値だけです。 Courses.Id
列の値はidentity
列であるため、自動生成されます。
また、Down()
メソッドを理解して、逆のプロセスを実装するか、実際にデータベースを以前のマイグレーションにダウングレードしない場合はそのまま残しておく必要があります。
また、移行とシーダー間でコードを分割することでこれを行うこともできます。スキーマの変更にはマイグレーションを、データ変更にはシーダーを使用することになっているので、概念的にはより正確です。しかし、この方法は簡単だと思うし、シードアのアプローチでは2つの移行が必要です:UPDATE
以外のすべてのコードを含むものと_Old
の列をドロップする文、 _Old
列を削除しました。 UPDATE
部分はシーダーに実装されます。
警告:UPDATE
文に含まれるSQLコードはSql Server
で動作しますが、他のデータベースエンジンでは機能しない可能性があります。シーダーの代わりにマイグレーションを使用することのもう一つの欠点です。
古いCourseテーブルのすべてのデータを 'Seed()'メソッドを使ってTempにアップサンプリングするCourseTempを追加するための移行はできますか?その後、元のコースを削除してCoureseTempクラス/テーブルの名前を変更する別の移行を行うことができますか? – Bwolfing