2016-02-05 148 views
1

我正在開發一個使用Entity Framework的多租戶Web應用程序,該項目正處於積極的開發階段,此過程可能需要一年或兩年。我使用Migrations來管理數據庫更改,添加新的表和子系統,管理數據庫triggers,播種默認數據等等。它們也將用於添加新租戶時,每個客戶可能有多個不同的數據庫,並且應用程序能夠使用migrations構建每個數據庫。管理實體框架遷移

雖然存在一個問題,但越來越難以管理更改並保持遷移清潔。雖然我們構建的系統不到10%,但我最終完成了50多次遷移,花了幾個小時纔將它們劃分爲三次或四次邏輯遷移。

這種方法還有另一個問題:突破變化。例如,當我使用view,向主表添加一個字段時,不會更新視圖和等等等等。

你知道解決這些問題的方法嗎?您在開發應用程序時如何使您的應用程序能夠構建其數據庫,並且它會經常更改。

+1

當談到管理遷移時,我經常會參考這篇博文。我得到了您的邏輯遷移概念 - 我們基本上通過向上滾動多個遷移來做同樣的事情。 http://cpratt.co/migrating-production-database-with-entity-framework-code-first/#at_pco=smlwn-1.0&at_si=54ad5c7b61c48943&at_ab=per-12&at_pos=0&at_tot=1 –

回答

1

如果您有一次或毫秒遷移,則無關緊要。當您應用遷移時,您可以設置目標遷移,並且所有遷移操作都作爲一個遷移操作執行。

您可以通過在軟件包管理器控制檯中運行get-help update-database來檢查Update-Database文檔。這些是可能的參數:

更新-數據庫[-SourceMigration] [-TargetMigration] [-Script] [-Force] [-ProjectName] [-StartUpProjectName] [-ConfigurationTypeName] [-ConnectionStringName] [ - AppDomainBaseDirectory] ​​[]

更新-數據庫[-SourceMigration] [-TargetMigration] [-Script] [-Force] [-ProjectName] [-StartUpProjectName] [-ConfigurationTypeName] -ConnectionString -ConnectionProviderName [-AppDomainBaseDirectory] ​​[]

如果你sp明確目標遷移,並且-Script您會看到所有包含的遷移都會創建一個SQL腳本來更新數據庫。如果您未指定該選項,則腳本將被髮送到數據庫服務器(在項目的連接字符串中)。

如果您未指定目標遷移,它會將數據庫遷移到最新的遷移。

這回答你的問題的第一部分。您不必擔心有一次,一次或幾百萬次遷移。沒有什麼比如「邏輯遷移」。

關於您的問題的第二部分,也沒有任何問題。如果您需要在應用程序中進行修改,例如向表格中添加列,則應該使更改解決方案更爲廣泛,即修改數據庫(通過使用遷移)並更新解決方案代碼以支持新列即更新業務邏輯,實體,視圖以及解決方案中的相關元素。此時你有一個穩定的版本。如果您部署此版本,並將數據庫更新爲最新的遷移,它將會正常工作,而不會「發生突變」。所以,只要你的代碼中有穩定的版本,你就必須給它一個版本號,這樣你才能部署該版本的numner。每個版本將具有兼容的代碼和遷移。您應該使用版本控制系統或任何其他方法來保持您的穩定版本。當然,如果你修改你的數據庫並且有不兼容的代碼(例如,你從一個表中刪除了一列,而你的代碼引用了該列),如果你嘗試部署它,它將不起作用。因此,只有在創建穩定版本時才需要小心,並且只有在處於該狀態時才使用版本號標記它們。

我有一個應用程序,它具有「更新到最新遷移」數據庫初始值設定項,並且每當我部署升級(甚至降級)到應用程序時,它都能正常工作。唯一的必要條件是部署的版本是穩定版本。