我得到了使用EF 5.0 Code First Migrations成功運行的默認ASP.NET MVC 4模板。但是,當我更新模型屬性名稱時,相應的表列數據由EF 5.0刪除。如何重命名實體框架5代碼中的數據庫列首次遷移不丟失數據?
是否有可能以自動方式重命名錶列而不丟棄數據?
我得到了使用EF 5.0 Code First Migrations成功運行的默認ASP.NET MVC 4模板。但是,當我更新模型屬性名稱時,相應的表列數據由EF 5.0刪除。如何重命名實體框架5代碼中的數據庫列首次遷移不丟失數據?
是否有可能以自動方式重命名錶列而不丟棄數據?
手動編輯遷移的向上和向下的方法來使用RenameColumn
方法來代替AddColumn
和DropColumn
,它會自動爲您生成。
現在,這個答案是基於我對EF4.3的瞭解,所以我希望在EF5中的遷移工作大致相同:)在創建遷移之後,您應該能夠在Up中添加代碼並在舊財產的丟棄和新財產的創建之間的減法方法。此代碼應該以正確的方向移動屬性數據。我已經使用SQL()方法解決了問題,您可以在其中輸入原始SQL來執行數據移動。
在遷移的up方法:
SQL("update [TheTable] set [NewColumn] = [OldColumn]");
和向下()方法:
SQL("update [TheTable] set [OldColumn] = [NewColumn]");
這種方法的缺點是,你可能對夫婦代碼與數據庫您現在正在使用中(因爲您正在編寫原始的特定於數據庫的SQL)。也可能有其他方法可用於數據移動。
可以在這裏找到更多信息:MSDN
添加到喬希加拉格爾的答案:
在sp_RENAME語法類似這樣的描述有些地方:
sp_RENAME 'TableName.[OldColumnName]' , '[NewColumnName]', 'COLUMN'
然而,實際上將包括在新的列名的括號內。
DbMigration的RenameColumn()方法可能會做同樣的事情,所以在指定新列名時避免使用括號。
另外,如果被重命名的列是主鍵的一部分,則Up()中自動生成的命令將包含DropPrimaryKey()和AddPrimaryKey()。使用RenameColumn()時不需要這些。如果需要,底層的sp_RENAME會自動更新主鍵。
像+喬什Gallagher表示,最多可以使用()做的事情,如:
public override void Up()
{
RenameColumn("dbo.atable","odlanem","newname");
AddColumn("dbo.anothertable", "columname", c => c.String(maxLength: 250));
}
我找到this在剛開到移民的好幫手;)
As already said,更換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");
}
}
}
您可以得到遷移叫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
屬性。
只需扔另一個有用的提示,你也可以在Package Manager控制檯:'Update-Database -Script'。然後你可以得到SQL'sp_rename'命令在你的閒暇時間運行。 :d – Jess
你有2個步驟中的代碼首先遷移到重命名列
[列(「Content」)]
public string描述{set;得到; }
第二步,
爲了創建部分類DbMigration添加遷移yournamechange命令。
加入到上下方法這裏
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在模型上面溝通的財產法。
要小心表中有點的表名。 'RenameColumn'生成一個'sp_rename' T-SQL語句,它在內部使用'parsename',它有一些限制。所以如果你有一個表名,裏面有點,然後使用:「SubSystemA.Tablename」,然後使用:'RenameColumn(「dbo。[SubSystemA.Tablename]」,「OldColumnName」,「NewColumnName」);' – Ilan