17

私たちのソリューションでは、しばらくの間EFCFを使用しています。大ファン!これまで、列挙型をサポートするためにハックを使用してきました(モデルに追加のフィールドを作成し、列挙型のマッピングを無視し、追加のフィールドを使用したはずのデータベースの列にマップします)。従来、列挙型は文字列(varchars)としてDBに格納されていました(読みやすくなります)。現在、EF 5(ベータ2)で列挙型がサポートされているため、DB内のint列への列挙型のマッピングのみがサポートされているようです。EF5に列挙型を文字列表現として格納させることはできますか。

ここで、「Type」はタイプDocumentTypeの列挙型です。

public enum DocumentType 
    {
        POInvoice,
        NonPOInvoice,
        Any
    }

私はそれを使用してマッピングしようとしました:

public class WorkflowMap : EntityTypeConfiguration<Model.Workflow.Workflow>
    {
        public WorkflowMap()
        {
            ToTable("Workflow", "Workflow");
            ...
            Property(wf => wf.Type).HasColumnType("varchar"); 

        }
    }

魔法の弾丸になると思っていましたが..

それはただ投げます:

指定されたスキーマが無効です。エラー:(571,12):エラー2019:指定されたメンバーマッピングが無効です。タイプ'Dodson.Data.DataAccess.EFRepositories.Workflow'のメンバー'Type'のタイプ'Dodson.Data.DataAccess.EFRepositories.DocumentType[Nullable = False、DefaultValue =]'は、'SqlServer.varchar [Nullable = False、DefaultValue =、MaxLength = 8000、Unicode = False、FixedLength =False]'タイプ'CodeFirstDatabaseSchema.Workflow'のメンバー'Type'。

あなたの考え?

4

2 に答える 2

16

現在、これは不可能です。EFの列挙型にはCLRの列挙型と同じ制限があります-それらは整数値のセットと呼ばれるだけです。確認のためにこの記事をチェックしてください:

EF列挙型の定義は概念層にあります。CLR列挙型と同様に、EF列挙型には、Edm.SByte、Edm.Byte、Edm.Int16、Edm.Int32、またはEdm.Int64のいずれかの基になる型があり、Edm.Int32は、指定されていない場合のデフォルトの基になる型です。

この問題に関する記事関連する提案を投稿しました。将来この機能を見たい場合は、提案に投票してください。

于 2012-04-16T19:04:36.503 に答える
11

私は数週間前にこの問題にぶつかりました。私が思いつくことができる最高のものは少しハッキーです。

クラスPersonにGender列挙型があり、データアノテーションを使用して文字列をデータベースにマップし、列挙型を無視します。

public class Person
{
    public int PersonID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [Column("Gender")]
    public string GenderString
    {
        get { return Gender.ToString(); }
        private set { Gender = value.ParseEnum<Gender>(); }
    }

    [NotMapped]
    public Gender Gender { get; set; }
}

そして、文字列から正しい列挙型を取得するための拡張メソッド。

public static class StringExtensions
{
    public static T ParseEnum<T>(this string value)
    {
        return (T)Enum.Parse(typeof(T), value, true);
    }
}

詳細については、この投稿を参照してください-http://nodogmablog.bryanhogan.net/2014/11/saving-enums-as-strings-with-entity-framework/

于 2014-11-27T04:41:19.063 に答える