实体框架更改Id类型

时间:2014-06-30 18:39:09

标签: c# sql sql-server entity-framework

我已将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);

如何在不丢弃整个数据库的情况下解决此问题?

3 个答案:

答案 0 :(得分:0)

您可能会尝试分阶段进行迁移 - 我不确定,但您的流畅配置导致根据您要更改的字段创建主键,并且迁移向导无法考虑需要删除主键将字段转换为guid,然后重建新的主键。

所以我的建议是在婴儿步骤中进行迁移: 1.从routineexerciseid中删除haskey并将其移动到另一个字段或创建一个新的复合键 - 需要一个主键 2.移动主键后,您应该可以更改列 3.最后在该列上恢复主键。

可替换地 创建一个全新的列作为主键作为guid,删除旧列,然后根据需要重命名新列

答案 1 :(得分:0)

我知道这是一个老问题,但是如果有其他人正在寻找这个答案,我自己就找到了。您需要在更改之前删除主键。

DropPrimaryKey(&#34; dbo.RoutineExercises&#34;,new [] {&#34; RoutineExerciseId&#34;});

答案 2 :(得分:0)

进行迁移重置比更改许多事情和可能破坏数据库要容易得多。我确实建议先备份您的数据,然后再继续。

此过程概述如下:

https://weblog.west-wind.com/posts/2016/jan/13/resetting-entity-framework-migrations-to-a-clean-slate