Как переименовать столбец базы данных в Entity Framework 5 Код Первые миграции без потери данных?

Я получил шаблон ASP.NET MVC по умолчанию, успешно работающий с EF 5.0 Code First Migrations. Однако, когда я обновляю имя свойства модели, соответствующие данные столбца таблицы отбрасываются EF 5.0.

Можно ли переименовать столбец таблицы без автоматического удаления данных?

Ответ 1

Вручную отредактируйте методы Up и Down миграции, чтобы использовать метод RenameColumn для замены AddColumn и DropColumn, которые он автоматически генерирует для вас.

Ответ 2

Как уже говорилось, замените AddColumn и DropColumn, которые автоматически генерируются с помощью RenameColumn.

Пример:

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");
        }
    }
}

Ответ 3

Теперь этот ответ основан на моем знании EF4.3, поэтому я надеюсь, что миграции работают примерно одинаково в EF5:) После того, как вы создали миграцию, вы должны иметь возможность добавлять код в Up и Down методов, между отбрасыванием старого свойства и созданием нового свойства. Этот код должен перемещать данные свойств в правильном направлении. Я решил это с помощью метода SQL(), в котором вы можете ввести исходный SQL для перемещения данных.

В методе Up метода миграции:

SQL("update [TheTable] set [NewColumn] = [OldColumn]");

и в методе Down():

SQL("update [TheTable] set [OldColumn] = [NewColumn]");

Недостатком этого подхода является то, что вы можете связать свой код с базой данных, с которой вы работаете в данный момент (поскольку вы пишете необработанный SQL-код, специфичный для БД). Могут быть и другие методы, доступные для перемещения данных.

Дополнительная информация доступна здесь: MSDN

Ответ 4

Добавляя к Джошу Галлахеру ответ:

В некоторых местах синтаксис sp_RENAME описывается следующим образом:

sp_RENAME 'TableName.[OldColumnName]' , '[NewColumnName]', 'COLUMN'

Однако на самом деле это будет включать скобки в новом имени столбца.

Метод DbMigration RenameColumn(), вероятно, сделает то же самое, поэтому избегайте использования скобок при указании имени нового столбца.

Кроме того, автоматически созданные команды в Up() и Down() включают DropPrimaryKey() и AddPrimaryKey(), если переименованный столб является частью первичного ключа. Они не нужны при использовании RenameColumn(). Основной sp_RENAME автоматически обновляет первичный ключ, если это необходимо.

Ответ 5

Вы можете получить перенаправление для вызова RenameColumn для вас, если вы это сделаете:

[Column("NewName")]
public string OldName { get; set; }

Вот сгенерированная миграция:

    public override void Up()
    {
        RenameColumn(table: "Schema.MyTable", name: "OldName", newName: "NewName");
    }

    public override void Down()
    {
        RenameColumn(table: "Schema.MyTable", name: "NewName", newName: "OldName");
    }

Если вы хотите, чтобы ваше свойство и столбец DB были одинаковыми, вы можете переименовать свойство позже и удалить атрибут Column.

Ответ 6

у вас есть 2 шага для переименования столбца в первой миграции кода

  • На первом этапе вы добавляете ColumnAttribute над столбцом, которые были изменены, а затем команда update-database

[Колонка ( "Content" )]
public string Описание {set; получить; }

  1. Второй шаг,

    • add-migration yournamechange, чтобы создать частичный класс DbMigration.

    • добавьте сюда вверх и вниз

RenameColumn ( "название" "yourDatabase", "NEWNAME" );

public override void Up()
  {
        RenameColumn("dbo.your_database", "oldColumn",          
       "newColumn");
  }


public override void Down()
  {
        RenameColumn("dbo.your_database", "newColumn", 
        "oldColumn");
  }

Потому что, когда вы подключаетесь, ваша база данных и класс модели будут связываться через name_column в базе данных и name_type по методу свойств в модели выше.

Ответ 7

like + Josh Gallagher сказал, вы можете использовать up() для выполнения таких действий, как:

public override void Up()
        {

            RenameColumn("dbo.atable","odlanem","newname");
            AddColumn("dbo.anothertable", "columname", c => c.String(maxLength: 250));

        }

я нашел this хорошую помощь в gettin для миграции;)