2011-11-10 63 views
2

我有一個枚舉,我想將它作爲某種類型的值存儲在底層數據庫中,以便我可以來回移動它。EnumDataTypeAttribute應該使用實體框架在.NET 4.0中正確工作嗎?

我讀過一些文章,建議創建一個靜態隱式運算符定義的枚舉包裝,使用複雜類型對象映射映射,如下面的鏈接中所述。

How to fake Enums in EF4

該解決方案完美的作品!我感謝Alex James

除此之外,我發現EnumDataTypeAttribute Class哪個目的似乎通過實體框架處理枚舉持久性。我試過了,它似乎根本不起作用。這是一個代碼示例。

public enum StreetDirection { 
    East 
    , None 
    , North 
    , NorthEast 
    , NorthWest 
    , South 
    , SouthEast 
    , SouthWest 
    , West 
} 

public enum StreetType { 
    Avenue 
    , Boulevard 
    , Court 
    , Crescent 
    , Drive 
    , Hill 
    , None 
    , Road 
    , Street 
} 

public class StreetTypeWrapper { 
    public int Value { 
     get { 
      return (int)t; 
     } 
     set { 
      t = (StreetType)value; 
     } 
    } 
    public StreetType EnumValue { 
     get { 
      return t; 
     } 
     set { 
      t = value; 
     } 
    } 

    public static implicit operator int(StreetTypeWrapper w) { 
     return w.Value; 
    } 

    public static implicit operator StreetType(StreetTypeWrapper w) { 
     return w == null ? StreetType.None : w.EnumValue; 
    } 

    public static implicit operator StreetTypeWrapper(int i) { 
     return new StreetTypeWrapper() { Value = i }; 
    } 

    public static implicit operator StreetTypeWrapper(StreetType t) { 
     return new StreetTypeWrapper() { EnumValue = t }; 
    } 

    private StreetType t; 
} 

public class Street { 
    [EnumDataType(typeof(StreetDirection))] 
    public StreetDirection Direction { get; set; } 
    public string Name { get; set; } 
    public int StreetId { get; set; } 
    public StreetTypeWrapper Type { get; set; } 
} 

public class StreetTypeMapping 
    : ComplexTypeConfiguration<StreetTypeWrapper> { 
    public StreetTypeMapping() { 
     Property(o => o.Value) 
      .HasColumnName("StreetType"); 
    } 
} 

現在,如果我相信,和/或正確地理解什麼MSDN說的有關EnumDataTypeAttribute類中,Direction財產應該得到堅持到數據庫中。那麼,它不會!除了EF不支持枚舉持久性外,我找不到這個原因。至於StreetTypeWrapper及其StreetTypeMapping班,它確實工作完美。

有沒有任何線索爲什麼EnumDataType不能按預期工作?

+0

對嗎?我沒有在Alex Jame的帖子上看到ComplexType映射。我跟隨你的模板,並在添加遷移期間,我得到一個錯誤,說自定義包裝(即StreetTypeWrapper)沒有定義的鍵。儘管我在模型/上下文中沒有DbSet <...Wrapper>,但它似乎認爲包裝也是一個實體。 –

回答

10

這是因爲.NET框架中的設計缺陷。 .NET框架包含着名的System.ComponentModel.DataAnnotations命名空間,其中定義了多個不同的屬性。 .NET框架的許多不同部分都使用這個名稱空間,但他們正在使用它來實現不同的任務,並且每個這樣的部分僅使用屬性的一些子集。這造成了很多混亂。

EnumDataTypeAttribute就是這樣的例子。該屬性僅適用於ASP.NET動態數據。它允許你用這個屬性標記int屬性,並且自動生成的UI將顯示帶有枚舉值的下拉菜單,而不是數字值的文本框。所以有從枚舉映射到int,但它在UI層不在模型/持久層。

+0

+1感謝您的好解釋。這就是爲什麼我不能讓我的枚舉堅持這種方式。無論如何,我更喜歡包裝解決方案,因爲缺少這樣的裝飾器。儘管後面的項目我會在UI上嘗試。謝謝! =) –

+0

+1感謝這個很好的解釋,我昨天才知道它,並打算在模型類中使用它:)。 –