我不能對其他的ORM的評論,但我自2007年以來,它一直使用DevExpress XPO作爲企業財資應用程序。每次發佈時,架構都會發生一些變化,但多年來也出現了一些大的架構變化。默認XPO升級機制的某種擴展版本可以很好地迎合所有的變化。
有關於升級XPO應用程序的基本信息here。
至於你提到,一些升級會自動XPO處理(例如,添加新列),但有些東西需要額外的控制,例如與現有記錄的默認值初始化新列。
例如,我們假設MyNewField
已被添加到您的應用程序2.0版中的MyEntity
XPO類中。假設現有記錄的默認值爲3。 XPO將處理新列的創建,但現有記錄將爲NULL。 (如果你在XPO類中指定了一個默認值,它只會涉及新的記錄)。爲了糾正現有記錄的值,你會加入類似以下到實體模塊的重寫UpdateDatabaseAfterSchemaUpdate()
:(您也可以使用ObjectSpace.GetObjects<MyEntity>()
和foreach
如果你喜歡,以避免直接SQL)
public override void UpdateDatabaseAfterUpdateSchema()
{
base.UpdateDatabaseAfterUpdateSchema();
if (CurrentDBVersion < new Version(2, 0, 0, 0))
ObjectSpace.GetSession().ExecuteNonQuery(
"UPDATE [MyEntity] SET [MyNewField] = 3 WHERE [MyNewField] IS NULL");
}
在將表分成兩部分的更極端的例子中,可以使用相同的方法,但是您可以覆蓋UpdateDatabaseBeforeUpdateSchema()
,而是運行SQL來拆分表,讓XPO執行任何其他模式更新,並在必要時填充任何默認值爲UpdateDatabaseAfterUpdateSchema()
。
您會發現碰到約束問題,例如外鍵違規,所以您可能會發現需要編寫一些常規例程,如DropAllForeignKeyConstraints()
作爲UpdateDatabaseBeforeUpdateSchema()
的一部分。有時你會發現XPO已經提供了一些東西,有時候不會。缺少約束和索引將在模式更新中重新生成。 (根據我的經驗,切換主數據表的主鍵竟然是最難的更新例程。)
默認情況下,調用都發生在SQL事務中,所以如果有任何失敗,它應該全部回滾。
開發人員需要了解何時對域模型進行更改可能會導致底層模式出現問題。
爲了進行測試,我們保留了一些舊的客戶數據庫,並在構建過程中運行一堆前後測試,以確保現有客戶能夠正確升級他們正在升級的任何版本。在生產中,只要遇到問題升級問題,問題數據就會添加到此測試庫中,以防止將來出現類似的問題。
我們正在與主要的國際公司和銀行打交道。客戶對結果非常滿意。在企業的DBA需要簽署變更的情況下,他們似乎並不介意使用命令行工具來執行升級,而不是使用腳本。
您所描述的與XAF有關,而不是專門用於XPO。 – Yuyo