Entity Framework 的枚舉類型


新增數據模型,新增“實體”之后,新增“枚舉類型”,創建Enum值,將“實體”中的列和Enum關聯,選中“實體”中的列屬性改變類型為Enum名稱,生成數據庫……

 

如下轉自:http://item.congci.com/item/entity-framework-meiju-leixing-enum

第一步:先創建一個實體對象,在VS 2012里面實體對象還可以修改實體顏色

第二步:對象已經有了,接着創建一個Type,Type為Enum,內部與外部(Internal and External),在空白處右鍵(學計算機編程時,老師就給我們說,遇到不會就先右鍵,之后再Google

打開模型瀏覽器,同樣可以添加Enum

第三步:創建Enum值

第四步:讓Type引用Enum,選中Type ,查看屬性

第五步:生成數據庫並添加數據

第六步:運行看一下結果,先猜一下輸出的類型 是 ?

很明顯,輸出的不是1,而是External,這正是我們在綁定時要的值,想不想再看一下數據庫里面存儲的是什么值呢?

第七步:查看數據庫

Type的值是 1 ,不是External,這樣是不是提高了我們的開發效率。


解決Entity Framework中枚舉類型與tinyint的映射問題

在代碼世界中,有一種常見的“變” —— 類型轉變。這篇文章分享的就是如何通過類型轉變,解決Entity Framework(5.0之前的版本)中枚舉類型(實體)與 tinyint(數據庫字段類型)的映射問題。

對於需要進行持久化的枚舉類型,我們通常在數據庫表中建立一個對應的tinyint類型的字段。

如果我們使用Entity Framework作為ORM,將面臨兩個問題:

1. EF不支持枚舉類型的直接映射(5.0之前的版本)

2. 對於tinyint數據庫類型,不管對應的實體屬性定義的是什么類型,EF始終映射為byte類型。

相應的解決方法也不難:

1. 給實體增加一個“中間人”屬性,與數據庫中對應的字段進行映射,然后再轉換為枚舉類型。

2. 將這個“中間人”屬性定義為byte類型。

於是就有了下面的代碼:

public class BlogCategory
{
    public CategoryType CategoryType { get; set; }

public byte CategoryTypeByte { get; set; } }

BlogCategory.CategoryType是枚舉類型的屬性,是代碼中實際訪問的屬性;BlogCategory.CategoryTypeByte是增加的“中間人”屬性,專用於映射數據庫中tinyint類型的字段。

隨之,難題出現了,如何在枚舉類型與bype類型之間進行轉換呢?在讀取BlogCategory.CategoryType屬性時,需要將byte轉換為枚舉;在寫入BlogCategory.CategoryType屬性時,需要將枚舉轉換為byte。

枚舉類型可以方便地轉換為int類型,但int類型是32位的(4個byte)。也就是說,這兩者尺碼不一樣,大轉小,要減肥;小轉大,要增胖。

對於類型轉換安全問題,我們無需擔心,因為數據庫中是tinyint類型,數據的長度不會超過1個byte。

那如何轉換呢?

.NET提供了一個強大的轉換器 —— System.BitConverter,讓我們來看看如何通過它實現72變。

1. 大轉小,減肥,枚舉轉byte。

復制代碼
public BlogCategoryType CategoryType
{
    set
    {
        CategoryTypeByte = BitConverter.GetBytes((int)value)[0];
    }
}
復制代碼

將枚舉轉換為int,再將int轉換為byte數組,然后取第一個元素。

2. 小轉大,增胖,byte轉枚舉。

復制代碼
public BlogCategoryType CategoryType
{
    get
    {
        return (BlogCategoryType)BitConverter.ToInt32(
            new byte[] { CategoryTypeByte, 0x0, 0x0, 0x0 }, 0);
    }
}
復制代碼

增加三個值為0的byte,與CategoryTypeByte組合為長度為4的byte數組(因為int類型的需要),然后將這個byte數組轉換為int類型。

注:該解決方法已通過臨床驗證,確實有療效,請放心使用!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM