Cambié el nombre de un par de entidades y sus propiedades de navegación y generé una nueva migración en EF 5. Como es habitual con los cambios de nombre en las migraciones de EF, por defecto iba a soltar objetos y recrearlos. Eso no es lo que quería, así que tuve que crear el archivo de migración desde cero.
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");
}
Todo lo que intento hacer es cambiar el nombre dbo.ReportSections
a dbo.ReportPages
y luego dbo.ReportSectionGroups
a dbo.ReportSections
. Entonces necesito cambiar el nombre de la columna de clave externa dbo.ReportPages
de Group_Id
a Section_Id
.
Estoy eliminando las claves externas e índices que unen las tablas, luego cambio el nombre de las tablas y la columna de clave externa, luego agrego los índices y las claves externas nuevamente. Supuse que esto iba a funcionar pero recibo un error de SQL.
Msg 15248, nivel 11, estado 1, procedimiento sp_rename, línea 215 O el parámetro @objname es ambiguo o el @objtype (COLUMN) reclamado es incorrecto. Msg 4902, nivel 16, estado 1, línea 10 No se puede encontrar el objeto "dbo.ReportSections" porque no existe o no tiene permisos.
No me está resultando fácil averiguar qué está mal aquí. Cualquier idea sería tremendamente útil.
Respuestas:
No importa. Estaba haciendo esto más complicado de lo que realmente necesitaba ser.
Esto era todo lo que necesitaba. Los métodos de cambio de nombre simplemente generan una llamada al procedimiento almacenado del sistema sp_rename y supongo que se encargó de todo, incluidas las claves externas con el nuevo nombre de columna.
fuente
RenameColumn
genera unasp_rename
declaración T-SQL que utiliza usosparsename
internamente, lo que tiene algunas limitaciones. Entonces, si tiene un nombre de tabla que tiene puntos, por ejemplo, "SubSystemA.Tablename", use:RenameColumn("dbo.[SubSystemA.Tablename]", "OldColumnName", "NewColumnName");
RenameIndex(..)
en su migración para cambiarle el nombreRenameTable(..)
para cambiar el nombre de los FK y PK. No suena bien, pero es lo que funcionó para mí. Es el método que crea el T-SQL (execute sp_rename ...
) correcto . Si actualiza-database -verbose, lo verá usted mismo.Si no le gusta escribir / cambiar el código requerido en la clase Migración manualmente, puede seguir un enfoque de dos pasos que crea automáticamente el
RenameColumn
código requerido:Paso uno Utilice
ColumnAttribute
para introducir el nombre de la nueva columna y luego agregar la migración (pAdd-Migration ColumnChanged
. Ej. )Paso dos: cambie el nombre de la propiedad y vuelva a aplicar a la misma migración (p
Add-Migration ColumnChanged -force
. Ej. ) En la Consola del Administrador de paquetesSi observa la clase Migración, puede ver que el código generado automáticamente es
RenameColumn
.fuente
The name 'Rename_SalesArea' is used by an existing migration.
-force
parámetro cuando use add-migrationPara expandir un poco la respuesta de Hossein Narimani Rad, puede cambiar el nombre de una tabla y columnas usando System.ComponentModel.DataAnnotations.Schema.TableAttribute y System.ComponentModel.DataAnnotations.Schema.ColumnAttribute respectivamente.
Esto tiene un par de beneficios:
Por ejemplo, agregando
[Table("Staffs")]
:Generará la migración:
fuente
En EF Core, uso las siguientes declaraciones para cambiar el nombre de tablas y columnas:
En cuanto a cambiar el nombre de las tablas:
En cuanto a cambiar el nombre de las columnas:
fuente
En ef core, puede cambiar la migración que se creó después de agregar la migración. Y luego actualice la base de datos. A continuación se muestra una muestra:
fuente
Intenté lo mismo en EF6 (cambiar el nombre de la primera entidad del código). Simplemente cambié el nombre de la clase y agregué una migración usando la consola del administrador de paquetes y listo, se generó automáticamente una migración usando RenameTable (...) para mí. Debo admitir que me aseguré de que el único cambio en la entidad fuera cambiarle el nombre para que no haya columnas nuevas o columnas renombradas, por lo que no puedo estar seguro de si esto es una cosa EF6 o simplemente que EF fue (siempre) capaz de detectar migraciones tan simples.
fuente
DbSet
en suDatabaseContext
también). Cambiar la clave principal causa problemas. La migración intentará eliminarlo y crear uno nuevo. Por lo tanto, debe ajustar eso y hacer lo que la respuesta de Chev es, cambiar el nombre de la columna.Los nombres de tabla y de columna se pueden especificar como parte del mapeo de
DbContext
. Entonces no es necesario hacerlo en migraciones.fuente