2014-06-30 13 views
5

Ho modificato il tipo di proprietà Id da Int a Guid, nessun'altra entità fa riferimento a Id e ho cancellato manualmente tutti i record di tale entità dal database, la mia classe di migrazione generata ha questo aspetto:Modifica Entity Framework Tipo 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)); 
} 

e sto ottenendo questo errore quando ho eseguito il comando update-database:

I 'PK_dbo.RoutineExercises' oggetto è dipendente sulla colonna 'RoutineExerciseId'. ALTER TABLE ALTER COLUMN RoutineExerciseId non riuscito perché uno o più oggetti accedono a questa colonna.

E la mia configurazione FluentAPI assomiglia a questo:

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); 

Come posso risolvere questo problema senza far cadere tutto il database?

risposta

0

Si potrebbe provare a eseguire la migrazione per fasi: non lo so per certo, ma la tua fluente configurazione porta alla creazione della chiave primaria in base al campo che desideri modificare e il wizard di migrazione non può prendere in considerazione la necessità di rilasciare la chiave primaria convertire il campo in un guid e quindi ricostruire una nuova chiave primaria.

Quindi il mio suggerimento sarebbe quello di fare la migrazione a piccoli passi: 1. Rimuovere il Haskey da routineexerciseid e spostarlo in un altro campo o fare un nuovo EF a chiave composito ha bisogno di una chiave primaria 2. Con la chiave primaria spostato dovresti essere in grado di modificare la colonna 3. Infine ripristina la chiave primaria su quella colonna.

alternativa Creare una nuova colonna come un GUID come chiave primaria, eliminare la vecchia colonna e poi, se necessario, rinominare il nuovo colonna come richiesto

0

So che questa è una vecchia questione, ma nel caso in cui nessun altro sta cercando questa risposta, l'ho appena scoperto da solo. È necessario rilasciare la chiave primaria prima di modificarla.

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

Problemi correlati