Как переименовать столбец базы данных в Entity Framework 5 Code First migrations без потери данных?
Я получил значение по умолчанию ASP.NET шаблон MVC 4 успешно работает с первыми миграциями кода EF 5.0. Однако, когда я обновляю имя свойства модели, соответствующие данные столбца таблицы удаляются EF 5.0.
можно ли как-то переименовать столбец таблицы без автоматического удаления данных?
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 шага, чтобы переименовать столбец в код первой миграции
- первый шаг, вы добавляете ColumnAttribute над вашим столбцом, которые изменяются, а затем update-database command
[Столбец("Содержание")]
описание публичной строки { set; get;}
второй этап
добавить-миграция команда 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)); }
Я нашел этой хорошая помощь в получении в миграции ;)