2014-06-30 201 views
5

我已經將Int類型的Id屬性從Int更改爲Guid,沒有其他實體引用該Id,並且我已從數據庫手動刪除該實體的所有記錄,我生成的遷移類看起來像這樣:實體框架更改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

您可以嘗試分階段進行遷移 - 我不確定,但您的流暢配置會導致基於您想要更改的字段創建主鍵,並且遷移向導不能考慮因素需要刪除主鍵將字段轉換爲GUID,然後重新生成一個新的主鍵。

所以我的建議是做嬰兒的步驟遷移: 1. routineexerciseid取出haskey並將其移動到另一個字段或進行新的組合鍵 - EF需要主鍵 2.主鍵移動你應該可以改變列 3.最後恢復該列的主鍵。

或者 創建一個完全新的列作爲一個GUID作爲主鍵,刪除舊列,然後在必要時重新命名爲需要

0

我知道這是一個老問題的新列,但如果任何人正在尋找這個答案,我只是自己找到了答案。您需要在更改之前刪除主鍵。

DropPrimaryKey(「dbo.RoutineExercises」,new [] {「RoutineExerciseId」});