我已将Int属性的类型从Int更改为Guid,没有其他实体引用Id并且我已从数据库手动删除该实体的所有记录,我生成的迁移类如下所示:
public override void Up()
{
AlterColumn("dbo.RoutineExercises", "RoutineExerciseId", c => c.Guid(nullable: false));
}
public override void Down()
{
AlterColumn("dbo.RoutineExercises", "RoutineExerciseId", c => c.Int(nullable: false, identity: true));
}
我在运行update-database命令时遇到此错误:
对象' PK_dbo.RoutineExercises'依赖于列' RoutineExerciseId'。 ALTER TABLE ALTER COLUMN RoutineExerciseId失败,因为一个或多个对象访问此列。
我的FluentAPI配置如下所示:
modelBuilder.Entity<RoutineExercise>().HasKey(r => r.RoutineExerciseId);
modelBuilder.Entity<RoutineExercise>()
.HasRequired(r => r.Exercise)
.WithMany()
.HasForeignKey(r => r.ExerciseId)
.WillCascadeOnDelete(true);
modelBuilder.Entity<RoutineExercise>()
.HasRequired(r => r.Routine)
.WithMany()
.HasForeignKey(r => r.RoutineId)
.WillCascadeOnDelete(true);
如何在不丢弃整个数据库的情况下解决此问题?
答案 0 :(得分:0)
您可能会尝试分阶段进行迁移 - 我不确定,但您的流畅配置导致根据您要更改的字段创建主键,并且迁移向导无法考虑需要删除主键将字段转换为guid,然后重建新的主键。
所以我的建议是在婴儿步骤中进行迁移: 1.从routineexerciseid中删除haskey并将其移动到另一个字段或创建一个新的复合键 - 需要一个主键 2.移动主键后,您应该可以更改列 3.最后在该列上恢复主键。
可替换地 创建一个全新的列作为主键作为guid,删除旧列,然后根据需要重命名新列
答案 1 :(得分:0)
我知道这是一个老问题,但是如果有其他人正在寻找这个答案,我自己就找到了。您需要在更改之前删除主键。
DropPrimaryKey(&#34; dbo.RoutineExercises&#34;,new [] {&#34; RoutineExerciseId&#34;});
答案 2 :(得分:0)
进行迁移重置比更改许多事情和可能破坏数据库要容易得多。我确实建议先备份您的数据,然后再继续。
此过程概述如下: