2

我正在使用實體框架代碼第一次使用遷移工作4.3。 在本地運行時,我的web.config被配置爲以數據庫初始化爲目標,該初始化實現了CreateDatabaseIfNotExists<DataContext>,它爲我的開發數據庫提供了測試數據,同時也在第一次運行時填充了各種「靜態」可查找數據。使用實體框架遷移進行種子和分支項目

一旦開發數據庫已經被創建,對數據庫的任何後續修改都會添加到項目的遷移並使用'updata-database'PS命令更新數據庫。

當我對項目感到滿意時,我使用webdeploy部署代碼,但手動複製數據庫,因爲webdeploy不包含遷移表。部署時,我使用web.config轉換來設置實現MigrateDatabaseToLatestVersion<DataContext>的新數據庫初始值設定項。然後這將應用之後部署的基於代碼的新遷移。 這一切都工作得很好,但我擔心這是不是用測試數據初始化我的數據庫,而是運行應用程序所需的數據的最佳方法。 我正在尋找的是創建初始種子數據而不必將其掛接到CreateDatabaseIfNotExists<DataContext>而是將其掛接到遷移中的好方法。 我意識到在配置類上有一個種子方法,但看到它在每次遷移時都更新數據庫,這是不可取的解決方案。

該項目是在TFS中,我不時需要創建這個項目的一個新的分支,這是本質的第一個克隆。當第一次在本地運行這個數據庫時,數據庫還不存在,但會像前面解釋的那樣創建和播種。現在最大的問題是,以前通過遷移處理的模式更改現在將在首次創建數據庫時應用。如果我然後嘗試添加新的遷移文件並運行'update-database',我會遇到難題,因爲它無法運行先前的遷移,因爲在創建數據庫時已經應用了這些更改。我只能想象我在這裏做錯了什麼或者只是錯過了一個竅門。

總之我正在尋找關於創建使用遷移首次數據庫時,種子初始測試數據&所需的應用程序數據

  1. 最佳方式的信息。
  2. 分支包含代碼遷移項目並首次創建數據庫時克服問題的最佳方法。

感謝您的閱讀。

回答

1

的最佳方式當 創建用於使用遷移首次數據庫種子初始測試數據&需要的應用數據。

遷移配置有Seed方法,它正好存在以解決此問題。在這種方法中,您可以使用AddOrUpdate擴展方法初始化您的核心數據。擴展方法將首先檢查數據庫中是否存在記錄,並更新記錄或插入新記錄。

+0

我知道所提到的種子的方法。我對使用它的擔心是它每次運行遷移時都會執行。 我的一些初步的核心數據會/可以通過應用程序時,它的運行變化,我不希望如果添加了新的遷移它復位。 如果你在配置類包裝的種子方法,因此只有執行的「InitialCreate」遷移我想這會工作,但我還沒有找到什麼好辦法做到這一點的一個好方法。 – Drauka 2012-04-19 10:22:14

+0

這是你的責任,以確保調用'Seed'方法是可重複的 - 'AddOrUpdate'可以用它幫助。如果您無法確保將自定義種子SQL語句直接添加到遷移中的「Up」方法。 – 2012-04-19 11:02:26

+1

我明白你在說什麼,但使用實體框架的諸多原因之一是爲了避免必須編寫相對複雜的SQL插入語句。而不是通過上下文播種。我正在尋找一種替代解決方案,並且會發布一次/如果檢查正在工作。 – Drauka 2012-04-19 11:16:01

1

我覺得初始化你的數據庫使用Seed方法是一個錯誤,除了非常小的和簡單的數據集。原因是,正如你所說,它只是運行得太頻繁。我們已將數據初始化從應用程序中移出並轉入安裝過程。我們剛剛構建了一組使用常規實體框架代碼創建所需數據的方法。這樣,我們不必擔心性能,並且可以更輕鬆地編寫驗證數據創建代碼的測試。

在開發期間初始化數據庫,我們有一整套的單元測試將運行安裝程序將執行相同的代碼。開發人員只需運行單元測試,他們的數據庫將被正確初始化。