是否可以在實體框架5代碼優先遷移中執行任何類型的編程式數據轉換?EF5中的編程數據轉換代碼第一次遷移
有一個sql()方法來執行查詢,但它有返回類型void,我沒有看到任何方式來獲得我執行的查詢的結果。
例
我有表配方與一個一對多關係成分。出於各種原因,我想將其轉換爲成分JSON字符串屬性。我能想到的唯一的辦法是這樣的:
- 創建新列IngredientsJson
- 對於每個配方,查詢其成分,編程構建一個JSON字符串,並插入到新列。
- 放棄舊錶成分。
是否可以在實體框架5代碼優先遷移中執行任何類型的編程式數據轉換?EF5中的編程數據轉換代碼第一次遷移
有一個sql()方法來執行查詢,但它有返回類型void,我沒有看到任何方式來獲得我執行的查詢的結果。
例
我有表配方與一個一對多關係成分。出於各種原因,我想將其轉換爲成分JSON字符串屬性。我能想到的唯一的辦法是這樣的:
你應該使用db'initializer'作爲你想要的 - 和/或'種子'的一種排序(關於何處注入EF流)。
您可以> take a look at this post with a customized <initializer
- 執行Db創建...和遷移。這不是剪切和粘貼解決方案,但大多數是有效的(這只是一個快速解決問題,你需要調整一下,它有幾個修復下面)。
MigrateDatabaseToLatestVersion
只計算遷移部分 - 並且您需要暴露 - 或者手動包裝該部分(主要點在於針對不同情況完成的「檢查」 - 即何時「參與」遷移或種子播種) 。
遷移應該先去,db的「創造」類型沒有什麼意義,除了播種。
您可以覆蓋Seed
(您創建的)以將任何數據庫處理置於此處 - 您將公開DbContext
- 如果需要,還可以調用SqlQuery
。
How to create initializer to create and migrate mysql database?
感謝您的意見。我認爲這個建議符合@Gert Arnold對我的問題的評論,並且據我所知,仍然存在相同的挑戰,以確保在適當的遷移步驟後正確播種。我真的認爲Seed()應該用於播種數據,因此它的名字,數據轉換是遷移步驟的一個自然部分。我認爲這樣做更有意義。但我可能會誤解。 – angularsen 2013-04-08 16:28:11
它實際上是 - 你可以稱之爲別的東西:)我想說的是,對於混合遷移/播種 - 你需要一個自定義初始化器。這就是它應該在的地方。然後(就像我做的那樣),在那裏 - 你可以「自己組裝」你自己的'StructureSeed' - 它們都是一樣的 - 無論如何它不再是'種子' - 你有一個有自己規則的新的初始化器。 – NSGaga 2013-04-08 16:31:06
另外 - 如果使用'DbMigrator',你不能真正改變它如何做那部分。所以遷移者會這樣做 - 遷移腳本中有什麼(您可以在那裏更改內容,但不是您想要的內容)。在這之後,'修補'db結構 - 無論是表格/鍵等 - 還是數據 - 只要一開始就不重要。請記住 - 只能在'空數據庫'或無數據庫情況下執行。 – NSGaga 2013-04-08 16:34:02
我想我會做變革的種子法,僅在新代碼中使用新列(S /桌,...),並留下去除舊的數據庫對象以下一次遷移。我在升級時混合使用DML和DDl有不好的經驗。除此之外,在新版本中使舊數據可用(儘管無法看到)是一種安全的感覺,因爲轉換可能始終引入意外的錯誤甚至數據丟失。還有一個問題:你爲什麼想要_獲取查詢結果_? – 2013-04-07 18:47:26
這個想法是得到一個Sql()命令的結果,我查詢了配方的成分,以編程方式將其轉換爲JSON數組成分。 感謝您的建議。我的方法看到的一個問題是,我需要確保在遷移到刪除Ingredient表的步驟之前,我已在所有數據庫上至少運行了一次Seed()。我只是將它看作是一件容易遺忘的事情,因此我希望將數據轉換作爲遷移步驟的一部分。它更有意義,看起來更健壯。 – angularsen 2013-04-07 19:07:49
是的,我可以看到。我寧願安全,也不要抱歉,JIRA是我的記憶。也許別人有你的場景經驗。這個有趣的問題有更多方面。我想知道你是否也應該在Down方法中提供反向轉換? – 2013-04-07 19:16:20