¿Cómo cambiar el nombre de una columna de base de datos en Entity Framework 5 Primeras migraciones de código sin perder datos?


Tengo el valor predeterminado ASP.NET La plantilla MVC 4 se ejecuta correctamente con las primeras migraciones de código EF 5.0. Sin embargo, cuando actualizo un nombre de propiedad de modelo, EF 5.0 elimina los datos de columna de tabla correspondientes.

¿Es posible cambiar el nombre de la columna de la tabla sin soltar datos de forma automatizada?

Author: Zanon, 2012-10-28

7 answers

Edite manualmente los métodos Arriba y Abajo de la migración para usar el método RenameColumn para reemplazar los AddColumn y DropColumn que genera automáticamente para usted.

 94
Author: Josh Gallagher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-29 00:41:26

Como ya se ha dicho , reemplace los AddColumn y DropColumn que se generan 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");
        }
    }
}
 29
Author: Zanon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:03:02

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 haber creado una migración, debería poder agregar código en los métodos Arriba y Abajo, entre la eliminación de la propiedad antigua 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 resuelto con el método SQL () en donde se puede introducir SQL sin procesar 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). También podría haber otros métodos disponibles para el movimiento de datos.

Más información disponible aquí: MSDN

 4
Author: Daniel Persson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-27 22:33:08

Usted puede obtener la migración para llamar 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 la columna DB tengan el mismo nombre, puede cambiar el nombre de la propiedad más tarde y eliminar el atributo Column.

 4
Author: Jess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-31 12:23:13

Añadiendo 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 incluirá los corchetes en el nuevo nombre de la columna.

El método RenameColumn() de DbMigration probablemente hará lo mismo, así que evite usar corchetes cuando especifique el nuevo nombre de columna.

Además, los comandos generados automáticamente en Up () & Down () incluyen DropPrimaryKey() y AddPrimaryKey () si la columna a la que se cambia el nombre es parte de la clave. Estos no son necesarios cuando se usa RenameColumn(). El sp_RENAME subyacente actualiza automáticamente la clave primaria si es necesario.

 3
Author: jk7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-25 00:19:06

Tiene 2 pasos para cambiar el nombre de la columna en el código first migration

  1. El primer paso, agrega ColumnAttribute encima de su columna que se cambia, y luego el comando update-database

[Columna("Contenido")]
descripción de la cadena pública { set; get;}

  1. 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 se conecta, su clase de base de datos y modelo se comunicará a través de name_column at database y name_type at property method en el modelo anterior.

 2
Author: Thảo Frederic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-19 08:31:34

Like + 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));

        }

He encontrado esto una buena ayuda en gettin en la migración;)

 0
Author: womd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-29 16:26:52