如何重命名entity framework5代码首先迁移数据库列而不丢失数据?

我得到了默认的ASP.NET MVC 4模板,并成功运行EF 5.0 Code First Migrations。 但是,当我更新模型属性名称时,相应的表列数据由EF 5.0删除。

是否有可能以自动的方式重命名表列而不丢弃数据?

手动编辑迁移的Up和Down方法,以使用RenameColumn方法replace它自动为您生成的AddColumnDropColumn

如前所述 ,replace使用DropColumn自动生成的AddColumnRenameColumn

例:

 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中的迁移工作大致相同:)创build迁移后,您应该能够在Up和Down方法中添加代码旧财产的丢弃和新财产的创造。 此代码应该以正确的方向移动属性数据。 我已经用SQL()方法解决了这个问题,你可以在其中input原始SQL来执行数据移动。

在迁移的Up方法中:

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

和Down()方法中:

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

这种方法的缺点是你可能会把你的代码和你正在使用的数据库(因为你正在编写原始的数据库特定的SQL)耦合在一起。 也可能有其他方法可用于数据移动。

更多信息在这里: MSDN

joinJosh Gallagher的回答:

在某些地方,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"); } 

如果您希望您的属性和数据库列名称相同,则可以稍后重命名该属性并删除Column属性。

你有2个步骤来重命名代码第一次迁移列

  1. 第一步,将columnAttribute添加到已更改的列的上方,然后使用update-database命令

[柱( “内容”)]
公共string描述{set; 得到; }

  1. 第二步,

    • 添加迁移yournamechange命令为了创build一个部分类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和上面模型中的property方法中的name_type进行通信。

就像+ Josh Gallagher说的那样,你可以用up()来做这样的事情:

 public override void Up() { RenameColumn("dbo.atable","odlanem","newname"); AddColumn("dbo.anothertable", "columname", c => c.String(maxLength: 250)); } 

我发现这是一个很好的帮助开始移民;)