2

作爲遷移我需要修改在一列中的某些現有的數據的一部分,但是這個更新必須使用C#代碼被轉換:數據必須被讀入到C#,改性,然後推回到數據庫。EF遷移 - 遷移期間修改現有數據W/C#業務邏輯

這些更改只能在此遷移過程中發生一次。 (因此,即使我檢查MigrationHistory表,也有可能在Seed方法中有條件地應用此數據更新,因爲可以一次應用多個遷移,並且在稍後遷移後不會發生此更新。)

我在遷移過程中無法使用純ADO.NET,因爲Up()方法僅構建框架將在稍後執行的操作,並且此修改依賴於遷移本身中的架構更改。 (即:vanilla ADO.NET調用會過早發生)。

我覺得最理想的方法是在框架的實際腳本執行過程中有條件地注入BL,但這個可擴展點是不提供。

回答

2

我在遷移過程中無法使用純ADO.NET,因爲Up()方法僅構建稍後將執行的操作,此修改依賴於遷移中的模式更改本身。 (即:vanilla ADO.NET調用會過早發生。)

創建兩個遷移。

第一個執行模式更改。

第二個作爲空遷移開始。您可以編輯Up()方法來執行修改數據所需的所有C#代碼。如果適用,請提供匹配的Down()方法。

請注意,您可以通過編輯第一次遷移,並把你的數據轉換代碼在Up()方法的結束,反轉(如適用)在Down()開始做這一切在一個單一的遷移方法。我發現單獨的遷移更清潔。

這些變化不僅要這種遷移

這是由遷徙的機制保證期間發生一次也是唯一。遷移按順序進行,只有尚未應用到目標數據庫的遷移纔會運行。

+0

我試着做這一切在一個單一的遷移,但香草ADO.NET代碼被稱爲* *之前,任何在'向上()'方法之前,它的架構修改的。我考慮過第二次遷移,但我主要嘗試避免進行3次遷移(在自定義BL運行後需要更多修改)。 – JoeBrockhaus

+0

當我在'Seed()'方法的上下文中提到「在特定遷移過程中只有一次」。由於我無法保證數據庫在運行時的版本(即:在TargetMigration + 3之後無法運行),因此我無法在其中執行修改。 – JoeBrockhaus

+0

我們最終只使用了一次遷移,並推遲了模式更改。一些架構的變化是使數據恢復事件壞變換遇到,但我們還是決定放棄,由於這是一個不太可能的邊緣情況下(在這種情況下,無論如何) – JoeBrockhaus