Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

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

2014-12-05 Friday

前言

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看似簡單,裡面有很多細節。而這些細節有時候看一篇教學文章是不會講到的內容,造成在實務上面使用的時候,一出現問題很不容易解決。


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


如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
2014-12-05 Friday
comments powered by Disqus