2011-11-10 10 views
2

私は、元のデータベースに何らかの値として保持したいので、前後に持っていくことができます。Entity Frameworkを使用して.NET 4.0でEnumDataTypeAttributeが正しく動作する必要がありますか?

私は定義された静的暗黙の事業者と列挙ラッパーを作成することをお勧めいくつかの記事を読んだことが、下記のリンクで説明したように複合型オブジェクトのマッピングを使用してマッピングされました。

How to fake Enums in EF4

このソリューションは完璧に動作します! Alex Jamesに感謝します。

さておき、私は列挙型は、Entity Frameworkを経由永続扱うように思われる目的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がenumsの永続性をサポートしていないことを除いて、私はこれの理由を見つけることができません。 StreetTypeWrapperとそのStreetTypeMappingクラスについては、完璧に動作します。

は期待通りEnumDataTypeが動作しない理由の任意の手掛かりはありますか?

+0

これについてはどうですか?私はAlex Jameの投稿にComplexTypeマッピングが表示されません。私はあなたのテンプレートに従いました。そして、Add-Migration中にカスタムラッパー(すなわちStreetTypeWrapper)にキーが定義されていないと言うエラーが出ました。モデル/コンテキストにDbSet <...Wrapper>がないにもかかわらず、ラッパーもエンティティであると思われるようです。 –

答えて

10

これは、.NETフレームワークの設計上の問題が原因です。 .NETフレームワークには、複数の異なる属性が定義されている有名なSystem.ComponentModel.DataAnnotations名前空間が含まれています。 .NETフレームワークの多くの部分がこの名前空間を使用していますが、異なる名前空間を使用しています。これは多くの混乱を引き起こします。

EnumDataTypeAttributeです。この属性は、ASP.NET Dynamic Dataの場合にのみ使用します。この属性でintプロパティをマークすることができます。自動的に生成されたUIは、数値のテキストボックスの代わりに列挙型の値でドロップダウンを表示します。したがって、enumからintへのマッピングがありますが、モデル/持続層にないUIレイヤーにあります。

+0

+1この良い説明に感謝します。これが私の列挙をこのように持続させることができなかった理由です。そのようなデコレータがないため、私はラッパーの回避策をとにかく好む。私はUIの上でそれを試してみましょう。ありがとう! =) –

+0

+1この良い説明もありがとう、私はちょうどそれについて昨日知っていて、モデルクラスでそれを使用するつもりだった:)。 –

関連する問題