2015-07-19 21 views
12

Mam odwrotną inżynierię istniejącej bazy danych do modelu pierwszego kodu. Niektóre tabele mają być przechowywane, ale większość ma zostać usunięta i całkowicie zmieniona na nową wersję.Migracje Entity Framework nie mogą upuszczać tabeli z powodu ograniczenia klucza obcego.

Usuwam niektóre stare klasy oraz ich mapowanie i dodawanie migracji.

Migracja wygląda następująco:

public override void Up() 
     { 
      DropForeignKey("dbo.Bingo_Review", "BingoID", "dbo.Bingo"); 
      DropForeignKey("dbo.Bingo_Review_Text", "BingoReviewID", "dbo.Bingo_Review"); 
      DropForeignKey("dbo.Bingo_Bonus", "BingoID", "dbo.Bingo"); 
      DropForeignKey("dbo.Bingo_Bonus_Amount", "BingoBonusID", "dbo.Bingo_Bonus"); 
      DropIndex("dbo.Bingo_Bonus", new[] { "BingoID" }); 
      DropIndex("dbo.Bingo_Review", new[] { "BingoID" }); 
      DropIndex("dbo.Bingo_Review_Text", new[] { "BingoReviewID" }); 
      DropIndex("dbo.Bingo_Bonus_Amount", new[] { "BingoBonusID" }); 
      DropTable("dbo.Bingo_Bonus"); 
      DropTable("dbo.Bingo"); 
      DropTable("dbo.Bingo_Review"); 
      DropTable("dbo.Bingo_Review_Text"); 
      DropTable("dbo.Bingo_Bonus_Amount"); 
      DropTable("dbo.Bingo_Bonus_Type"); 
     } 

Jednak gdy uruchomię migrację, pojawia się następujący błąd w konsoli menedżera pakietów.

Could not drop object 'dbo.Bingo_Bonus' because it is referenced by a FOREIGN KEY constraint. 

Dlaczego pojawia się ten błąd, gdy migracja powinna już upuścić wszystkie klucze obce przed poleceniem tabeli kropel? Czy jest jakiś sposób obejścia tego?

+0

Może być jeszcze zapomniał usunąć BingoBonusID z każdego stołu. Po sprawdzeniu może ci się uda rozwiązanie. – Tonny

+0

Dzięki. Jednak szukałem rozwiązania dla bingo i jedyne odniesienie do niego znajduje się w klasie migracji I podanej powyżej. –

Odpowiedz

4

Nie można upuścić Bingo_Bonus tabeli, ponieważ nadal ma odniesień do Bingo_Bonus_Amount i Bingo_Bonus_Type tabel, zmieniając kolejność w górę() metoda rozwiąże problemu

poprzez umieszczenie:

DropTable("dbo.Bingo_Bonus_Amount"); 
DropTable("dbo.Bingo_Bonus_Type"); 

przed:

DropTable("dbo.Bingo_Bonus"); 

Twój kod będzie:

public override void Up() 
    { 
     DropForeignKey("dbo.Bingo_Review", "BingoID", "dbo.Bingo"); 
     DropForeignKey("dbo.Bingo_Review_Text", "BingoReviewID", "dbo.Bingo_Review"); 
     DropForeignKey("dbo.Bingo_Bonus", "BingoID", "dbo.Bingo"); 
     DropForeignKey("dbo.Bingo_Bonus_Amount", "BingoBonusID", "dbo.Bingo_Bonus"); 
     DropIndex("dbo.Bingo_Bonus", new[] { "BingoID" }); 
     DropIndex("dbo.Bingo_Review", new[] { "BingoID" }); 
     DropIndex("dbo.Bingo_Review_Text", new[] { "BingoReviewID" }); 
     DropIndex("dbo.Bingo_Bonus_Amount", new[] { "BingoBonusID" }); 
     DropTable("dbo.Bingo_Bonus_Amount"); 
     DropTable("dbo.Bingo_Bonus_Type"); 
     DropTable("dbo.Bingo_Bonus"); 
     DropTable("dbo.Bingo"); 
     DropTable("dbo.Bingo_Review"); 
     DropTable("dbo.Bingo_Review_Text"); 

    } 
21

Jeśli kiedykolwiek zmieniła się nazwa tabeli dbo.Bingo_Bonus lub zmieniła się którakolwiek z kolumn relacji klucza obcego, EF nie zmienia automatycznie nazw ograniczeń klucza obcego automatycznie. Miałem podobny problem i musiałem ręcznie dodać linię tak, ponieważ funkcja DropForeignKey() nie został faktycznie usunięcie klucza to miało:

Sql(@"ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT [FK_dbo.Constraint_Name_From_Before_Table_Change]"); 
+1

Dzięki! Nie wiedziałem, że EF nie zmienia nazw ograniczeń klucza obcego. Rozwiązałem podobny problem przez ręczną zmianę ograniczenia FK. – ErazerBrecht

+7

Taki sam, ale trochę ładniejszy: DropForeignKey ("dbo.MyTable", "FK_dbo.Constraint_Name_From_Before_Table_Change"); – akl22

1

udało mi się spaść użyciu GUI. Podczas próby uruchomienia zapytania z alter, "." Symbol był o jakiś błąd wyświetlany

enter image description here

enter image description here

enter image description here