Ответ 1
Вручную отредактируйте методы Up и Down миграции, чтобы использовать метод RenameColumn
для замены AddColumn
и DropColumn
, которые он автоматически генерирует для вас.
Я получил шаблон ASP.NET MVC по умолчанию, успешно работающий с EF 5.0 Code First Migrations. Однако, когда я обновляю имя свойства модели, соответствующие данные столбца таблицы отбрасываются EF 5.0.
Можно ли переименовать столбец таблицы без автоматического удаления данных?
Вручную отредактируйте методы Up и Down миграции, чтобы использовать метод RenameColumn
для замены AddColumn
и DropColumn
, которые он автоматически генерирует для вас.
Пример:
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(), в котором вы можете ввести исходный SQL для перемещения данных.
В методе Up метода миграции:
SQL("update [TheTable] set [NewColumn] = [OldColumn]");
и в методе Down():
SQL("update [TheTable] set [OldColumn] = [NewColumn]");
Недостатком этого подхода является то, что вы можете связать свой код с базой данных, с которой вы работаете в данный момент (поскольку вы пишете необработанный SQL-код, специфичный для БД). Могут быть и другие методы, доступные для перемещения данных.
Дополнительная информация доступна здесь: MSDN
Добавляя к Джошу Галлахеру ответ:
В некоторых местах синтаксис sp_RENAME описывается следующим образом:
sp_RENAME 'TableName.[OldColumnName]' , '[NewColumnName]', 'COLUMN'
Однако на самом деле это будет включать скобки в новом имени столбца.
Метод DbMigration RenameColumn(), вероятно, сделает то же самое, поэтому избегайте использования скобок при указании имени нового столбца.
Кроме того, автоматически созданные команды в Up() и Down() включают DropPrimaryKey() и AddPrimaryKey(), если переименованный столб является частью первичного ключа. Они не нужны при использовании RenameColumn(). Основной sp_RENAME автоматически обновляет первичный ключ, если это необходимо.
Вы можете получить перенаправление для вызова 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
.
у вас есть 2 шага для переименования столбца в первой миграции кода
[Колонка ( "Content" )]
public string Описание {set; получить; }
Второй шаг,
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 по методу свойств в модели выше.
like + Josh Gallagher сказал, вы можете использовать up() для выполнения таких действий, как:
public override void Up()
{
RenameColumn("dbo.atable","odlanem","newname");
AddColumn("dbo.anothertable", "columname", c => c.String(maxLength: 250));
}
я нашел this хорошую помощь в gettin для миграции;)