c# - que - mvc entity framework español
Cómo cambiar el nombre de una columna de base de datos en el código de Entity Framework 5 Primeras migraciones sin perder datos? (7)
Obtuve la plantilla predeterminada de ASP.NET MVC 4 ejecutándose con éxito con EF 5.0 Code First Migrations. Sin embargo, cuando actualizo el nombre de una propiedad del modelo, EF 5.0 elimina los datos de la columna de la tabla correspondiente.
¿Es de alguna manera posible cambiar el nombre de la columna de la tabla sin descartar datos de forma automática?
Agregando a la respuesta de Josh Gallagher:
En algunos lugares, la sintaxis sp_RENAME se describe así:
sp_RENAME ''TableName.[OldColumnName]'' , ''[NewColumnName]'', ''COLUMN''
Sin embargo, eso realmente incluirá los corchetes en el nuevo nombre de columna.
El método RenameColumn () de DbMigration probablemente haga lo mismo, así que evite usar corchetes cuando especifique el nuevo nombre de columna.
Además, los comandos autogenerados en Arriba () y Abajo () incluyen DropPrimaryKey () y AddPrimaryKey () si la columna que se renombra es parte de la clave principal. No son necesarios cuando se utiliza RenameColumn (). El sp_RENAME subyacente actualiza automáticamente la clave principal si es necesario.
Ahora, esta respuesta se basa en mi conocimiento de EF4.3, así que espero que las migraciones funcionen aproximadamente igual en EF5 :) Después de que haya creado una migración, debería poder agregar código en los métodos Arriba y Abajo, entre el abandono de la propiedad anterior y la creación de la nueva propiedad. Este código debe mover los datos de la propiedad en la dirección correcta. Lo he solucionado con el método SQL () en donde puedes ingresar SQL sin formato para realizar el movimiento de datos.
En el método Up de la migración:
SQL("update [TheTable] set [NewColumn] = [OldColumn]");
y en el método Down ():
SQL("update [TheTable] set [OldColumn] = [NewColumn]");
La desventaja de este enfoque es que puede acoplar su código con la base de datos con la que está trabajando en este momento (ya que está escribiendo SQL específico de DB sin procesar). Puede haber otros métodos disponibles para el movimiento de datos también.
Más información disponible aquí: MSDN
Puede obtener la migración para llamar a RenameColumn
por usted si hace esto:
[Column("NewName")]
public string OldName { get; set; }
Aquí está la migración generada:
public override void Up()
{
RenameColumn(table: "Schema.MyTable", name: "OldName", newName: "NewName");
}
public override void Down()
{
RenameColumn(table: "Schema.MyTable", name: "NewName", newName: "OldName");
}
Si desea que su propiedad y columna DB sean del mismo nombre, puede cambiar el nombre de la propiedad más adelante y eliminar el atributo Column
.
como + Josh Gallagher dijo, puedes usar up () para hacer cosas como:
public override void Up()
{
RenameColumn("dbo.atable","odlanem","newname");
AddColumn("dbo.anothertable", "columname", c => c.String(maxLength: 250));
}
Me pareció una buena ayuda para iniciar la migración;)
tienes 2 pasos para cambiar el nombre de la columna en el primer código de migración
- El primer paso, agrega ColumnAttribute sobre su columna que se cambian, y luego el comando update-database
[Columna ("Contenido")]
cadena pública Descripción {set; obtener; }
El segundo paso,
add-migration yournamechange comando para crear una clase parcial DbMigration.
agregar en el método arriba y abajo aquí
RenameColumn ("yourDatabase", "name", "newName");
public override void Up()
{
RenameColumn("dbo.your_database", "oldColumn",
"newColumn");
}
public override void Down()
{
RenameColumn("dbo.your_database", "newColumn",
"oldColumn");
}
Porque cuando te conectas, tu base de datos y clase de modelo se comunicarán mediante name_column en la base de datos y name_type en el método de propiedad en el modelo anterior.
Como ya se dijo , reemplace AddColumn
y DropColumn
que se genera automáticamente con RenameColumn
.
Ejemplo:
namespace MyProject.Model.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class RenameMyColumn : DbMigration
{
public override void Up()
{
// Remove the following auto-generated lines
AddColumn("dbo.MyTable", "NewColumn", c => c.String(nullable: false, maxLength: 50));
DropColumn("dbo.MyTable", "OldColumn");
// Add this line
RenameColumn("dbo.MyTable", "OldColumn", "NewColumn");
}
public override void Down()
{
// Remove the following auto-generated lines
AddColumn("dbo.MyTable", "OldColumn", c => c.String(nullable: false, maxLength: 50));
DropColumn("dbo.MyTable", "NewColumn");
// Add this line
RenameColumn("dbo.MyTable", "NewColumn", "OldColumn");
}
}
}
Edite manualmente los métodos Arriba y Abajo de la migración para usar el método RenameColumn
para reemplazar AddColumn
y DropColumn
que genera automáticamente para usted.