2014年12月5日 星期五

[Entity Framework] 如何在Database Designer把一個int欄位轉成Enum形態 (Entity Framework Convert int to Enum)

前言

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的欄位。

image
Post table所擁有的欄位

再來,我們在程式裡面,定義一個enum叫做status,這個定義是用來和DB裡面的int做對應。

namespace ConsoleApplication1
{
public enum Status
{
草稿,
已發佈,
已刪除
}
}

設定把int轉成enum


把int轉成enum其實非常的簡單,只需要打開我們的.edmx然後找到要轉換的欄位 image

打開edmx


對他點右鍵然後會看到有個選項是:Convert To Enum

image
開啟Convert To Enum的畫面

這個時候就會看到新增Enum的畫面。這邊有兩個欄位我有設定:



  1. Enum Type Name:這個Enum要命名的名稱
  2. Reference External Type: 如果我們別的地方已經有定義了要用的enum,可以直接輸入他的Fully Qualified Name,那麼就會自動對應。需要注意,如果輸入錯誤,那麼產生出來的type也會錯

其實如果外部沒有定義過enum,也可以透過這個介面直接定義enum內容。
image
設定enum畫面

設定完了之後,產生出來的class檔案如下:

image
最後產生出來的Class

當DB table重新建立的時候,在設定成為enum形態遇到的問題


把int轉成enum其實很簡單,但是如果對於背後的機制不瞭解的話,就會遇到這個處理不了的情況。


假設,今天我們把這個PostClass刪掉了,然後又從新加回來。這個時候,會發現Status欄位會變回int。這個時候我們再用一樣 的方式把int轉成enum,會發現會有問題:

image
無法轉換

這個時候會發現完全沒有辦法在新增一筆,這個到底是爲什麽呢?


int轉Enum的原理


後來在思考一下,其實不管enum是由外部reference的還是直接透過ui建立enum值,其實edmx都會記錄。


我們可以從Visual Studio的Entity Data Model Browser來開啟看看edmx有的內容。這個時候應該會看到Model下面的Enum Types有一筆剛剛建立的Status

imageimage
開啟Entity Data Model Browser

當我們在把int轉換成為enum的時候,給的Enum type name其實就是定義的enum名稱,而edmx是認得這個名字而已,而不認得其他。

其實edmx裡面總共會記錄3種資訊,其實我以前曾經介紹entity framework的power point有提到過,但是久了自己都忘記了:

解決方法


既然我們知道edmx只認得它內部看的懂得形態,這個時候我們就可以透過ui去選擇欄位的形態,這個時候就會發現我們建立的enum:

imageimage
設定欄位形態

結論


其實int轉enum看似簡單,裡面有很多細節。而這些細節有時候看一篇教學文章是不會講到的內容,造成在實務上面使用的時候,一出現問題很不容易解決。


因此,有時候還真需要靜下心來瞭解背後的原理,才知道如何解決。


2 則留言 :

  1. 想說投影片內容也太眼熟了吧
    結果發現我之前有google到耶~而且還有加入我的最愛清單喔~
    完全沒注意過作者的名字
    沒想到你就是本人XD
    寫得好啊~~~

    回覆刪除
  2. 雖然說過了一年多才發現你的留言實在是Orz - 沒想到我的部落格會有人留言

    有空多來逛逛 - 說不定會看到一些有用的內容 - 雖然說目前也沒很多內容,更新也不穩定OTZ

    謝謝啦

    回覆刪除