J'ai inversé la base de données existante avec le modèle code-first. Certaines tables doivent être conservées, mais la plupart doivent être supprimées et complètement restructurées pour la nouvelle version.
Je supprime certaines anciennes classes et leur mappage et add-migration.
La migration ressemble à ceci:
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");
}
Cependant, lorsque j'exécute la migration, l'erreur suivante apparaît dans la console du gestionnaire de packages.
Could not drop object 'dbo.Bingo_Bonus' because it is referenced by a FOREIGN KEY constraint.
Pourquoi est-ce que je reçois cette erreur alors que la migration aurait déjà dû supprimer des clés étrangères avant la commande drop table? Y a-t-il un moyen de contourner cela?
Si le nom de la table dbo.Bingo_Bonus
a déjà changé ou si l'une des colonnes des relations de clé étrangère a été modifiée, EF ne renomme pas automatiquement les contraintes de clé étrangère pour les faire correspondre. J'ai eu un problème similaire et j'ai dû ajouter manuellement une ligne comme celle-ci car la fonction DropForeignKey()
ne supprimait pas réellement la clé qu'elle était supposée:
Sql(@"ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT [FK_dbo.Constraint_Name_From_Before_Table_Change]");
Vous ne pouvez pas supprimer la table Bingo_Bonus
, car elle contient toujours des références aux tables Bingo_Bonus_Amount
et Bingo_Bonus_Type
. Le fait de modifier l'ordre dans la méthode Up () résoudra le problème
en mettant :
DropTable("dbo.Bingo_Bonus_Amount");
DropTable("dbo.Bingo_Bonus_Type");
avant:
DropTable("dbo.Bingo_Bonus");
Votre code sera:
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");
}