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


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

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

7 55

7 ответов:

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

как уже было сказано заменить 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");
        }
    }
}

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

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

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

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

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

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

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

вы можете получить миграцию для вызова 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");
    }

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

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

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

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

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

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

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

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

  1. первый шаг, вы добавляете ColumnAttribute над вашим столбцом, которые изменяются, а затем update-database command

[Столбец("Содержание")]
описание публичной строки { set; get;}

  1. второй этап

    • добавить-миграция команда yournamechange для того, чтобы создать частичный класс DbMigration.

    • добавить в up и down метод здесь

RenameColumn ("yourDatabase", "name", "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 в методе свойства в модели выше.

как +Джош Галлахер сказал, Вы можете использовать up () для выполнения таких вещей, как:

public override void Up()
        {

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

        }

Я нашел этой хорошая помощь в получении в миграции ;)