2016-05-06 77 views
1

我需要使用遷移將代碼第一個實體框架屬性從一個實體移動到另一個實體。這與Move property to new Entity in Entity Framework Code First Migration類似,但有一個額外的摺痕:我需要在我的應用程序中發佈遷移,以便具有現有數據的客戶可以自動遷移。在實體框架代碼第一次遷移中刪除移動的屬性

在這個問題接受的答案說,打破過程分爲三個遷移:

  1. 添加新的屬性
  2. 從舊屬性的數據移動到新的物業
  3. 刪除舊的財產

用於在所述第二移動數據移動的代碼是:

using (var context = new AppContext()) 
{ 
    var events = context.Set<Event>().ToArray(); 
    foreach (var ev in events) 
    { 
     ev.Location = new Location { City = ev.City }; 
    } 
    context.SaveChanges(); 
} 

問題是,當我刪除舊屬性以生成第三次遷移時,第二次遷移的代碼將不再編譯,因爲屬性ev.City不再存在。

在第二次遷移中仍然移動數據的同時,在第三次遷移中從代碼模型和數據庫中刪除屬性的正確方法是什麼?有沒有辦法編寫第二個遷移代碼來移動數據而不參考ev.City?是否有實體框架方法可以讓我檢索ev.City的值,而不需要具有該名稱的屬性,還是需要一直拖放到原始SQL命令?

回答

1

我不會在遷移中使用上下文。相反,我會在遷移中使用它:

Sql(「UPDATE x SET foo = bar」);

然後,無論你的實體是什麼樣子。

+0

我想你可能是對的,我不得不直接使用SQL,但它比簡單的更新更復雜。第二個遷移代碼也插入新的實體,所以至少需要一個INSERT ... SELECT語句。這可能比使用上下文更快,但它也更容易出錯。感謝您指出Sql函數以用於遷移。 –

+0

@StuartMalone好消息是,在原始SQL中測試非常容易。另外我相信你添加的任何東西都會被包裝在一個自動交易中。 – BigJump

1

正如@BigJump指出的,在遷移中使用Context可能是不好的做法。該DbMigration.Sql方法允許包含在遷移任意SQL,並擁有超過使用環境相關的幾個優點:

  1. 它的服務器,這可能是快執行。
  2. 它被自動放入遷移事務中,所以遷移是原子的。
  3. 由於不需要上下文,因此可以在第一次遷移結束時執行它,而不需要單獨的遷移。

在給出的例子中,語句

Sql("INSERT INTO Locations (Event_Id, City) SELECT Id, City FROM Events"); 

將被放置在第一遷移向上方法的底部。

相關問題