如何重命名entity framework5代码首先迁移数据库列而不丢失数据?
我得到了默认的ASP.NET MVC 4模板,并成功运行EF 5.0 Code First Migrations。 但是,当我更新模型属性名称时,相应的表列数据由EF 5.0删除。
是否有可能以自动的方式重命名表列而不丢弃数据?
手动编辑迁移的Up和Down方法,以使用RenameColumn
方法replace它自动为您生成的AddColumn
和DropColumn
。
如前所述 ,replace使用DropColumn
自动生成的AddColumn
和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中的迁移工作大致相同:)创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个步骤来重命名代码第一次迁移列
- 第一步,将columnAttribute添加到已更改的列的上方,然后使用update-database命令
[柱( “内容”)]
公共string描述{set; 得到; }
-
第二步,
-
添加迁移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)); }
我发现这是一个很好的帮助开始移民;)