我可以将枚举存储为EF 5中的字符串吗?

时间:2012-04-16 18:19:24

标签: entity-framework entity-framework-5

我们在解决方案中使用EF CF已有一段时间了。大粉丝!到目前为止,我们一直在使用hack来支持枚举(在模型上创建一个额外的字段;忽略enum durring映射;并将额外的字段映射到我们将使用的db中的列)。传统上我们一直将我们的枚举存储为DB中的字符串(varchars)(使其变得美观和可读)。现在,在EF 5(Beta 2)中支持enum,看起来它只支持将枚举枚举到DB中的int列....我们可以让EF 5将我们的枚举存储为字符串表示。

" 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:成员   指定的映射无效。类型   &#39; Dodson.Data.DataAccess.EFRepositories.DocumentType [可空=假,默认值=]&#39;   会员&#39;类型&#39;在类型   &#39; Dodson.Data.DataAccess.EFRepositories.Workflow&#39;不兼容   同   &#39; SqlServer.varchar [可空=假,默认值=,的MaxLength = 8000,的Unicode =假,定长= FALSE]&#39;   会员&#39;类型&#39;在类型&#39; CodeFirstDatabaseSchema.Workflow&#39;。

你的想法?

2 个答案:

答案 0 :(得分:16)

目前无法做到这一点。 EF中的枚举与CLR中的枚举具有相同的限制 - 它们只是命名的整数值集。检查this article以确认:

  

EF枚举类型定义存在于概念层中。与...类似   CLR枚举EF枚举的底层类型是Edm.SByte,   Edm.Byte,Edm.Int16,Edm.Int32或Edm.Int64与Edm.Int32是   默认底层类型,如果没有指定。

我发布了关于此问题的articlerelated suggestion。如果您希望将来看到此功能,请投票赞成该建议。

答案 1 :(得分:11)

几个星期前我遇到了这个问题。我能想到的最好的是有点hacky。

我在类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/