2014-06-30 14 views
5

Ich habe den Typ der Id-Eigenschaft von Int in Guid geändert, keine anderen Entitäten verweisen auf diese ID und ich habe alle Datensätze dieser Entität manuell aus der Datenbank gelöscht. Meine generierte Migrationsklasse sieht folgendermaßen aus:Änderung des Entitätsframeworks ID-Typ

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

Und ich bin immer diese Fehlermeldung, wenn ich update-Datenbank Befehl ausführen:

Das Objekt 'PK_dbo.RoutineExercises' ist abhängig von der Spalte 'RoutineExerciseId'. ALTER TABLE ALTER COLUMN RoutineExerciseId ist fehlgeschlagen, weil ein oder mehrere Objekte auf diese Spalte zugreifen.

Und meine FluentAPI Konfiguration sieht wie folgt aus:

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

Wie kann ich dieses Problem beheben, ohne die gesamte Datenbank zu fallen?

Antwort

0

Sie könnten versuchen, die Migration schrittweise durchzuführen - ich weiß es nicht genau, aber Ihre fließende Konfiguration führt zur Erstellung des Primärschlüssels basierend auf dem Feld, das Sie ändern möchten, und der Migrationsassistent kann nicht berücksichtigt werden Wenn Sie den Primärschlüssel löschen müssen, konvertieren Sie das Feld in eine GUID und erstellen Sie dann einen neuen Primärschlüssel.

Also mein Vorschlag wäre, die Migration in kleinen Schritten zu tun: 1. Haskey von routineexerciseid entfernen und in ein anderes Feld wechseln oder eine neue Verbund Tasten- ef machen muss einen Primärschlüssel 2. Mit dem Primärschlüssel verschoben Sie sollten in der Lage sein, die Spalte zu ändern 3. Schließlich den Primärschlüssel für diese Spalte wieder herstellen.

Alternativ Erstellen Sie eine völlig neue Spalte als ein als Primärschlüssel guid, die alte Säule fallen lassen und dann bei Bedarf Umbenennungs als die neue Spalte

erforderlich
0

Ich weiß, dass dies eine alte Frage, aber falls jemand anders Ich suche diese Antwort, ich habe es gerade selbst herausgefunden. Sie müssen den Primärschlüssel vor dem Löschen löschen.

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

Verwandte Themen