2012-09-26 59 views
7

假設我的對象有一個Name字段,並且我希望將它分成FirstName和LastName字段。或者,也許它有一個地址字符串,我要添加需要地理編碼的Lat和Lng字段。等等如何編寫轉換數據的實體框架遷移(最好使用DbContext)?

我希望能夠在Up()和Down()方法中訪問我的DbContext,但是我所能找到的(除了內置函數之外)都是.Sql()調用。這足以添加和刪除列,但不適用於將現有數據轉換爲新格式。

在Up()調用中引用我的DbContext是否安全?或者是否有另一種推薦的模式用於實施遷移,需要的不僅僅是微不足道的SQL?

回答

0

不,您不能在Up方法中使用DbContext方法,因爲它已經引用了新模型,但是您的數據庫仍然以舊模型爲目標。

編輯:

所有數據遷移都必須通過Sql完成。例如,您可以創建臨時表,將舊數據移動到臨時表,使用表結構的遷移並將數據從臨時表移回到原始數據庫,直接在SQL中使用一些轉換 - 分割varchar值應該不是什麼大問題。

+2

我所需的轉換不能像SQL一樣完成(分割變量是一個極其簡單的例子)。這種遷移操作在像ActiveRecord這樣的鴨式ORM中非常自然,但是這是EF方法會遇到麻煩的一個區域。 – Seth

0

而不是試圖將名稱拆分爲兩個不同的字段,請重新考慮您的遷移。有時它可能是最好的階段。我可以想到兩種方法來執行轉換。

遷移路徑#1:新領域,然後刪除舊

  1. 創建的名字和姓氏的新領域遷移,並在向上()方法,你仍然有Name字段,把它分解,插入第一個和最後一個字段。
  2. 創建另一個遷移以刪除舊名稱字段。

遷移路徑#2:重新設計和重新命名

  1. 創建遷移將姓氏字段,並重新命名的名稱,名字,移動姓數據,修改重命名的第一個/ Name字段只有名字。

兩條路徑都有優點和缺點。無論您的轉型的複雜程度如何,您都應該能夠將其劃分爲邏輯階段來完成目標。

相關問題