前言
enum其實內部儲存的形態還是int,所以任何一個int都可以直接cast成為某一個enum type,這樣就可以用那個enum的形態來操作這些值,在撰寫和閱讀程式上面就會變得比較乾淨和一目了然。
Entity Framework在Code First模式下要定義一個enum非常的簡單,只需要把type設定成為那個enum,Entity Framework就會聰明到把DB的對應欄位開成int,並且儲存和讀取的時候幫忙自動轉換。
但是當使用Database First模式的時候,因為Designer從DB讀取回來只會把int當做int,因此要他自動產出enum是需要做一些設定。
這一篇將會介紹把int轉成enum如何做到,並且需要注意那些地方。
範例的環境設定
我們會用一個簡單的Database,裡面只有一個Table叫做Post
,代表每一筆部落格裡面的文章。
在裡面有個欄位叫做Status
表示目前這篇文章的狀態,就是今天我們要來看的int轉enum的欄位。
再來,我們在程式裡面,定義一個enum叫做status
,這個定義是用來和DB裡面的int做對應。
namespace ConsoleApplication1
{
public enum Status
{
草稿,
已發佈,
已刪除
}
}
設定把int轉成enum
把int轉成enum其實非常的簡單,只需要打開我們的.edmx
然後找到要轉換的欄位
對他點右鍵然後會看到有個選項是:Convert To Enum
這個時候就會看到新增Enum的畫面。這邊有兩個欄位我有設定:
- Enum Type Name:這個Enum要命名的名稱
- Reference External Type: 如果我們別的地方已經有定義了要用的enum,可以直接輸入他的Fully Qualified Name,那麼就會自動對應。需要注意,如果輸入錯誤,那麼產生出來的type也會錯。
設定完了之後,產生出來的class檔案如下:
當DB table重新建立的時候,在設定成為enum形態遇到的問題
把int轉成enum其實很簡單,但是如果對於背後的機制不瞭解的話,就會遇到這個處理不了的情況。
假設,今天我們把這個Post
Class刪掉了,然後又從新加回來。這個時候,會發現Status
欄位會變回int
。這個時候我們再用一樣 的方式把int
轉成enum,會發現會有問題:
這個時候會發現完全沒有辦法在新增一筆,這個到底是爲什麽呢?
int轉Enum的原理
後來在思考一下,其實不管enum是由外部reference的還是直接透過ui建立enum值,其實edmx
都會記錄。
我們可以從Visual Studio的Entity Data Model Browser
來開啟看看edmx有的內容。這個時候應該會看到Model
下面的Enum Types
有一筆剛剛建立的Status
Enum type name
其實就是定義的enum名稱,而edmx是認得這個名字而已,而不認得其他。 解決方法
既然我們知道edmx只認得它內部看的懂得形態,這個時候我們就可以透過ui去選擇欄位的形態,這個時候就會發現我們建立的enum:
結論
其實int轉enum看似簡單,裡面有很多細節。而這些細節有時候看一篇教學文章是不會講到的內容,造成在實務上面使用的時候,一出現問題很不容易解決。
因此,有時候還真需要靜下心來瞭解背後的原理,才知道如何解決。
想說投影片內容也太眼熟了吧
回覆刪除結果發現我之前有google到耶~而且還有加入我的最愛清單喔~
完全沒注意過作者的名字
沒想到你就是本人XD
寫得好啊~~~
雖然說過了一年多才發現你的留言實在是Orz - 沒想到我的部落格會有人留言
回覆刪除有空多來逛逛 - 說不定會看到一些有用的內容 - 雖然說目前也沒很多內容,更新也不穩定OTZ
謝謝啦