2016-06-28 37 views
1

我正在使用實體框架 - 代碼優先。數據庫已經填滿。 我必須添加一個列到一個表並刪除兩個其他列。新的專欄將充滿舊專欄的合併。 我正在嘗試使用遷移和種子方法。在遷移過程中刪除它們之前,從另一列填充新列表

我恢復任務:

  1. 在表中添加一列;
  2. 用來自其他兩列的數據填充新列;
  3. 刪除其他兩列。

這裏我的移民:

public partial class MyNewMigration : DbMigration 
{ 
    public override void Up() 
    { 
     AddColumn("customers.myTable", "newCol", c => c.String()); 
     DropColumn("customers.myTable", "oldCol1"); 
     DropColumn("customers.myTable", "oldCol2"); 
    } 

    public override void Down() 
    { 
     AddColumn("customers.myTable", "oldCol1", c => c.String()); 
     AddColumn("customers.myTable", "oldCol2", c => c.String()); 
     DropColumn("customers.myTable", "newCol"); 
    } 
} 

難道我必須添加代碼來填充up方法中新列?

+1

是的,在添加和刪除之間使用Sql()命令:https://msdn.microsoft.com/en-us/data/jj591621.aspx#sql –

回答

1

我是否必須添加代碼以填充Up方法中的新列?

是的,你需要改變你的數據!也許您需要在複雜的數據轉換中使用Sql函數或存儲過程。

例如,你可以在你的遷移文件中做:

AddColumn("customers.myTable", "newCol", c => c.String()); 
Sql("UPDATE customers.myTable SET newCol= ''"); 

Sql("Update customers.myTable SET newCol = oldCol1+ oldCol2"); 

正如我前面提到的,如果你需要一個複雜的數據改造的探討,你必須使用存儲過程或函數使用輸入/輸出參數,你首先要添加它們,然後通過Sql命令可以使用它們。

另外,您可以使用遷移種子。 Seed方法在每個遷移級別之間調用,例如,如果您有遷移級別1,2,3,那麼它將被調用3次。種子方法的問題是,您必須在一個文件中爲所有遷移級別構建遷移邏輯。您可以使用開關盒或其他方式,然後檢查您的級別。如果您處於1級,那麼您可以添加用於遷移級別1的代碼邏輯,並且如果您處於級別2,那麼您必須添加級別2 et。的代碼。這個apporach對我來說不是乾淨的,如果你想使用它,那麼就使用它與工廠模式,允許爲每個遷移級別(SRP)分配代碼。兩個apporachs都這樣做,這取決於你。

+0

謝謝,但在這一刻,我做了不理解種子方法的含義..我可能沒有每種遷移的種子方法嗎?或者種子方法只用於初始化數據庫?初始化數據庫時,我能否不使用相同的方法? 它看起來像有兩種不同的方式來做同樣的事情! – Ciccio

相關問題