2012-07-05 70 views
2

我正在爲我的項目進行數據遷移。但是我有一個問題,例如: 我書表以下字段:MVC3中的數據遷移(使用EF.4.3)

ID Name Color 

1 Java red 

2 MVC  blue 

3 .Net blue 

我試圖使用代碼首先高科技領域的名稱從「顏色」到「BookColor」改變。但遷移後,表看起來像這樣:

ID Name BookColor 

1 Java null 

2 MVC  null 

3 .Net null 

我失去了我的字段值。我怎樣才能確保所有的價值都被轉移?

我使用實體框架與MVC3

編輯這是我DBMigration類:

public partial class AddCreative : DbMigration 
{ 

    public override void Up() 
    { 
     AddColumn("Authors", "Names", c => c.String(maxLength: 4000)); 
     DropColumn("Authors", "Name"); 
    } 


    public override void Down() 
    { 
     AddColumn("Authors", "Name", c => c.String(maxLength: 4000)); 
     DropColumn("Authors", "Names"); 
    } 
} 

改變後,我已經改變了NameNames(我失去了在名稱字段我的數據)。

首先,設置的遷移:

PM> Enable-Migrations 
PM> Add-Migration RenameBookColorColumn 

然後我們設置遷移類進行重命名:

+0

我們可以看到你現在是'DbMigration'類嗎? – 2012-07-05 12:58:22

+0

這是我的DBMigration類 – 2012-07-05 13:27:41

回答

6

我用下面沒有任何問題

public class RenameBookColorColumn : DbMigration 
{ 
    public override void Up() 
    { 
     this.RenameColumn("Books", "Color", "BookColor"); 
    } 
    public override void Down() 
    { 
     this.RenameColumn("Books", "BookColor", "Color"); 
    } 
} 

下一步,撥打Update-Database,以便我們可以執行更改:

PM> Update-Database -Verbose 
Using NuGet project 'Example'. 
Using StartUp project 'ExampleTest'. 
Target database is: 'ExampleContext' (DataSource: .\SQLEXPRESS, Provider: System.Data.SqlClient, Origin: Convention). 
Applying explicit migrations: [201207051400010_RenameBookColorColumn]. 
Applying explicit migration: 201207051400010_RenameBookColorColumn. 
EXECUTE sp_rename @objname = N'Books.Color', @newname = N'BookColor', 
@objtype = N'COLUMN' [Inserting migration history record] 

瞧,它被重新命名並保留了數據。

+0

謝謝 - 我已經試過了你的代碼。 - 我得到這個錯誤 - 「SQL Server Compact不支持直接重命名,要重命名SQL Server Compact中的一列,您需要重新創建它。」 – 2012-07-06 05:11:45

+1

這裏有你的答案,你將需要重新創建我們使用sql express/server的數據庫。 – 2012-07-06 12:43:27

+0

但是,如果我將重新創建我會再次丟失我的數據這就是我不想要的東西 – 2012-07-07 04:24:40

0

您可以通過使用下面的代碼來解決該限制。

public partial class AddCreative : DbMigration 
{ 
    public override void Up() 
    { 
     AddColumn("Authors", "Names", c => c.String(maxLength: 4000)); 
     Sql("UPDATE [Authors] SET [Names] = [Name]"); 
     DropColumn("Authors", "Name"); 
    } 

    public override void Down() 
    { 
     AddColumn("Authors", "Name", c => c.String(maxLength: 4000)); 
     Sql("UPDATE [Authors] SET [Name] = [Names]"); 
     DropColumn("Authors", "Names"); 
    } 
}