J'ai renommé quelques entités et leurs propriétés de navigation et généré une nouvelle migration dans EF 5. Comme d'habitude avec les renommages dans les migrations EF, par défaut, il allait supprimer des objets et les recréer. Ce n'est pas ce que je voulais, alors j'ai à peu près dû créer le fichier de migration à partir de zéro.
public override void Up()
{
DropForeignKey("dbo.ReportSectionGroups", "Report_Id", "dbo.Reports");
DropForeignKey("dbo.ReportSections", "Group_Id", "dbo.ReportSectionGroups");
DropForeignKey("dbo.Editables", "Section_Id", "dbo.ReportSections");
DropIndex("dbo.ReportSectionGroups", new[] { "Report_Id" });
DropIndex("dbo.ReportSections", new[] { "Group_Id" });
DropIndex("dbo.Editables", new[] { "Section_Id" });
RenameTable("dbo.ReportSections", "dbo.ReportPages");
RenameTable("dbo.ReportSectionGroups", "dbo.ReportSections");
RenameColumn("dbo.ReportPages", "Group_Id", "Section_Id");
AddForeignKey("dbo.ReportSections", "Report_Id", "dbo.Reports", "Id");
AddForeignKey("dbo.ReportPages", "Section_Id", "dbo.ReportSections", "Id");
AddForeignKey("dbo.Editables", "Page_Id", "dbo.ReportPages", "Id");
CreateIndex("dbo.ReportSections", "Report_Id");
CreateIndex("dbo.ReportPages", "Section_Id");
CreateIndex("dbo.Editables", "Page_Id");
}
public override void Down()
{
DropIndex("dbo.Editables", "Page_Id");
DropIndex("dbo.ReportPages", "Section_Id");
DropIndex("dbo.ReportSections", "Report_Id");
DropForeignKey("dbo.Editables", "Page_Id", "dbo.ReportPages");
DropForeignKey("dbo.ReportPages", "Section_Id", "dbo.ReportSections");
DropForeignKey("dbo.ReportSections", "Report_Id", "dbo.Reports");
RenameColumn("dbo.ReportPages", "Section_Id", "Group_Id");
RenameTable("dbo.ReportSections", "dbo.ReportSectionGroups");
RenameTable("dbo.ReportPages", "dbo.ReportSections");
CreateIndex("dbo.Editables", "Section_Id");
CreateIndex("dbo.ReportSections", "Group_Id");
CreateIndex("dbo.ReportSectionGroups", "Report_Id");
AddForeignKey("dbo.Editables", "Section_Id", "dbo.ReportSections", "Id");
AddForeignKey("dbo.ReportSections", "Group_Id", "dbo.ReportSectionGroups", "Id");
AddForeignKey("dbo.ReportSectionGroups", "Report_Id", "dbo.Reports", "Id");
}
Tout ce que je suis en train de faire est de renommage dbo.ReportSections
à dbo.ReportPages
puis dbo.ReportSectionGroups
à dbo.ReportSections
. Ensuite, je dois renommer la colonne de clé étrangère dbo.ReportPages
de Group_Id
à Section_Id
.
Je laisse tomber les clés étrangères et les index reliant les tables ensemble, puis je renomme les tables et la colonne de clé étrangère, puis j'ajoute à nouveau les index et les clés étrangères. J'ai supposé que cela allait fonctionner mais j'obtiens une erreur SQL.
Msg 15248, niveau 11, état 1, procédure sp_rename, ligne 215 Soit le paramètre @objname est ambigu, soit le @objtype (COLUMN) déclaré est erroné. Msg 4902, niveau 16, état 1, ligne 10 Impossible de trouver l'objet «dbo.ReportSections» car il n'existe pas ou vous ne disposez pas des autorisations.
Je n'ai pas le temps de comprendre ce qui ne va pas ici. Toute idée serait extrêmement utile.
Réponses:
Ça ne fait rien. Je rendais ce chemin plus compliqué qu'il ne le fallait vraiment.
C'était tout ce dont j'avais besoin. Les méthodes de changement de nom génèrent simplement un appel à la procédure stockée système sp_rename et je suppose que cela s'est occupé de tout, y compris les clés étrangères avec le nouveau nom de colonne.
la source
RenameColumn
génère unesp_rename
instruction T-SQL qui utilise des utilisations enparsename
interne, ce qui présente certaines limitations. Donc, si vous avez un nom de table contenant des points, par exemple "SubSystemA.Tablename", utilisez:RenameColumn("dbo.[SubSystemA.Tablename]", "OldColumnName", "NewColumnName");
RenameIndex(..)
dans votre migration pour le renommerRenameTable(..)
pour renommer les FK et PK. Cela ne semble pas correct, mais c'est ce qui a fonctionné pour moi. C'est la méthode qui crée le bon T-SQL (execute sp_rename ...
). Si vous faites update-database -verbose, vous le verrez par vous-même.Si vous n'aimez pas écrire / modifier manuellement le code requis dans la classe Migration, vous pouvez suivre une approche en deux étapes qui crée automatiquement le
RenameColumn
code requis:Étape 1 Utilisez le
ColumnAttribute
pour introduire le nouveau nom de colonne, puis ajoutez-migration (par exempleAdd-Migration ColumnChanged
)Étape 2: modifiez le nom de la propriété et appliquez à nouveau la même migration (par exemple
Add-Migration ColumnChanged -force
) dans la console du gestionnaire de packageSi vous regardez la classe Migration, vous pouvez voir le code généré automatiquement
RenameColumn
.la source
The name 'Rename_SalesArea' is used by an existing migration.
-force
paramètre lors de l'utilisation d'add-migrationPour développer un peu la réponse de Hossein Narimani Rad, vous pouvez renommer à la fois une table et des colonnes en utilisant respectivement System.ComponentModel.DataAnnotations.Schema.TableAttribute et System.ComponentModel.DataAnnotations.Schema.ColumnAttribute.
Cela présente quelques avantages:
Par exemple, ajouter
[Table("Staffs")]
:Générera la migration:
la source
Dans EF Core, j'utilise les instructions suivantes pour renommer les tables et les colonnes:
Quant au changement de nom des tables:
Quant à renommer les colonnes:
la source
Dans ef core, vous pouvez modifier la migration créée après l'ajout de la migration. Et puis faites update-database. Un échantillon a donné ci-dessous:
la source
J'ai juste essayé la même chose dans EF6 (renommer la première entité du code). J'ai simplement renommé la classe et ajouté une migration à l'aide de la console du gestionnaire de packages et voilà, une migration à l'aide de RenameTable (...) a été automatiquement générée pour moi. Je dois admettre que je me suis assuré que le seul changement apporté à l'entité était de le renommer, donc pas de nouvelles colonnes ou de colonnes renommées, donc je ne peux pas être certain s'il s'agit d'une chose EF6 ou simplement qu'EF était (toujours) capable de détecter ces migrations simples.
la source
DbSet
dans votreDatabaseContext
également). La modification de la clé primaire pose des problèmes. La migration essaiera de le supprimer et d'en créer un nouveau. Vous devez donc ajuster cela et faire comme la réponse de Chev, renommer la colonne.Les noms de table et les noms de colonne peuvent être spécifiés dans le cadre du mappage de
DbContext
. Ensuite, il n'est pas nécessaire de le faire dans les migrations.la source