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

Joe*_*ear 17 entity-framework entity-framework-5

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

其中"Type"是DocumentType类型的枚举

public enum DocumentType 
    {
        POInvoice,
        NonPOInvoice,
        Any
    }
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下方法进行映射:

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

        }
    }
Run Code Online (Sandbox Code Playgroud)

我以为是魔术子弹但是......

这只是抛出:

指定的架构无效.错误:(571,12):错误2019:指定的成员映射无效.类型'Dodson.Data.DataAccess.EFRepositories.Workflow'中成员'Type'的类型'Dodson.Data.DataAccess.EFRepositories.DocumentType [Nullable = False,DefaultValue =]'与'SqlServer.varchar不兼容[Nullable =在'CodeFirstDatabaseSchema.Workflow'类型中成员'Type'的False,DefaultValue =,MaxLength = 8000,Unicode = False,FixedLength = False]'.

你的意见?

Lad*_*nka 16

目前这是不可能的.EF中的枚举与CLR中的枚举具有相同的限制 - 它们只是命名的整数值集.查看此文章以确认:

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

我发布了关于这个问题的文章相关建议.如果您希望将来看到此功能,请投票赞成该建议.


Bry*_*yan 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; }
}
Run Code Online (Sandbox Code Playgroud)

以及从字符串中获取正确枚举的扩展方法.

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

有关详细信息,请参阅此帖子 - http://nodogmablog.bryanhogan.net/2014/11/saving-enums-as-strings-with-entity-framework/