2015-07-19 14 views
12

Varolan veritabanını kod ilk modele ters mühendislik uygulamam var. Bazı tablolar saklanmalı, ancak çoğu yeni sürüm için kaldırılmalı ve tamamen yeniden tasarlanmalıdır.Entity Framework Migrasyonlar, yabancı anahtar kısıtlaması nedeniyle tabloyu düşürebilir

Bazı eski sınıfları ve bunların eşleme ve ek geçişini siliyorum.

göç ​​şuna benzer: Ben göçü çalıştırdığınızda

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

Ancak, paket yöneticisi konsolunda aşağıdaki hatayı alıyorum.

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

Geçiş, komut tablosu komutundan önce geçişin herhangi bir yabancı anahtarı bırakmış olması nedeniyle neden bu hatayı alıyorum? Bunun etrafında bir yolu var mı? hala Bingo_Bonus_Amount ve Bingo_Bonus_Type tablolara başvuru olduğundan

+0


enter image description here

enter image description here

görüntülenen başlamıştı. Bir kez kontrol edin, çözüm bulabilirsin. – Tonny

+0

Teşekkürler. Ancak bingo için çözüm aradım ve tek referansı yukarıda sağlanan göç sınıfında. –

cevap

4

Sen koyarak yöntem sorunu

çözecektir) (Up sırasını değiştirerek, Bingo_Bonus tablo bırakamazsınız:

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

önce:

DropTable("dbo.Bingo_Bonus"); 

Kodunuz olacaktır:

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

dbo.Bingo_Bonus tablo adı hiç değişmişse veya yabancı anahtar ilişkilerinde herhangi bir sütun değiştiyse, EF, yabancı anahtar kısıtlamalarını otomatik olarak eşleşecek şekilde yeniden adlandırmaz. Benzer bir sorun vardı ve DropForeignKey() işlev aslında gerekiyordu anahtarı silme değildi çünkü elle böyle bir satır eklemek zorunda:

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

Teşekkürler! EF'in yabancı anahtar kısıtlamalarını yeniden tanımladığını bilmiyordum. FK Constraint'i manuel olarak değiştirerek benzer bir problemi çözdüm. – ErazerBrecht

+7

Aynı ama biraz daha hoş: DropForeignKey ("dbo.MyTable", "FK_dbo.Constraint_Name_From_Before_Table_Change"); – akl22

1

Ben GUI kullanarak damla başardı. Sorguyu, "." Ile değiştirmeye çalışıldığında simge bazı hata hala herhangi tablodan BingoBonusID kaldırmak için unuttum olabilir enter image description here