2012-08-13 87 views
7

this question,我發現枚舉變化沒有被實體框架遷移處理。實際上,枚舉更改甚至不會導致模型更改錯誤,因此您可以隨意更改枚舉而不需要任何控制。實體框架中處理枚舉變化5

導致不同INT的值,例如爲了改變或清除枚舉的變化,能有效地使數據庫數據無效,因爲所存儲的整數的意義是現在錯誤的。

爲了遷移工作,你必須手動執行該改變改變枚舉值自定義的SQL。

的問題是,開發人員必須記住要做到這一點,而且如果有疏忽則可能會出現有效的數據損壞。

某人如何才能對此進行檢查?是否有可能,如果枚舉更改,拋出模型更改錯誤或類似的東西?

+1

同樣的問題適用於重命名:如果有人忘了把專門老列將被丟棄,並且一個新創建的。如果停機是一個問題,自動遷移不適合生產使用。 – usr 2012-08-13 21:38:26

+0

由於新枚舉不需要更改模型,因此不會引發模型更改錯誤。 EF無法知道數據庫中的枚舉值「1」與具有該值的「Car」不同,但自從重命名爲「卡車」後,枚舉通常被視爲常量,不應更改。 – simbolo 2012-08-14 14:34:03

+0

那麼有ContextKey - 一個完全限定的類型名稱 - 和一個模型 - 這是__MigrationHistory表中的某種二進制blob。該blob應該包含Enum定義並檢測這種變化。顯然它沒有。這看起來像EF的糟糕設計。 – Eiver 2017-09-08 13:22:48

回答

2

與枚舉類似的問題也存在於淨,當你移動他們到不同的項目中使用的庫:

http://bytes.com/topic/c-sharp/answers/271483-q-why-casting-enum#post1086722

試試吧 - 一般來說枚舉是出奇的脆弱。答案是始終爲您的枚舉指定一個明確的值,以防止這兩個問題。這可以讓你繼續利用自己的核心價值(明確的名字而不是幻數,並且更多地在方法參數中鍵入安全性),但是可以防止你悄悄地破壞一切。

您可以執行這項政策通過正則表達式代碼審查或提交後鉤子。