Entity framework 我可以将枚举作为字符串存储在EF 5中吗?

Entity framework 我可以将枚举作为字符串存储在EF 5中吗?,entity-framework,entity-framework-5,Entity Framework,Entity Framework 5,我们在解决方案中使用EF CF已有一段时间了。大粉丝!到目前为止,我们一直在使用hack来支持enum(在模型上创建一个额外的字段;忽略enum durring映射;并将额外的字段映射到我们将使用的db中的列)。传统上,我们一直将枚举存储为数据库中的字符串(varchar)(使其美观且可读)。现在EF 5(Beta 2)支持枚举,看起来它只支持将枚举映射到DB中的int列……我们可以让EF 5将枚举存储为字符串表示形式吗 其中“Type”是DocumentType类型的枚举 public enu

我们在解决方案中使用EF CF已有一段时间了。大粉丝!到目前为止,我们一直在使用hack来支持enum(在模型上创建一个额外的字段;忽略enum durring映射;并将额外的字段映射到我们将使用的db中的列)。传统上,我们一直将枚举存储为数据库中的字符串(varchar)(使其美观且可读)。现在EF 5(Beta 2)支持枚举,看起来它只支持将枚举映射到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"); 

        }
    }
公共类工作流映射:EntityTypeConfiguration
{
公共工作流程图()
{
ToTable(“工作流”、“工作流”);
...
属性(wf=>wf.Type);
}
}
我原以为这会是一颗神奇的子弹但是

这就是:

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


你的想法?

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

EF枚举类型定义位于概念层中。类似于 CLR枚举EF枚举的基础类型为Edm.SByte, Edm.Byte、Edm.Int16、Edm.Int32或Edm.Int64,其中Edm.Int32为 如果未指定任何基础类型,则为默认基础类型


我发布了关于这个问题的信息。如果您希望在将来看到此功能,请投票支持此建议

几周前我遇到了这个问题。我能想出的最好办法就是有点老套

我在类Person上有一个性别枚举,我使用数据注释将字符串映射到数据库并忽略该枚举

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; }
}
公共类人物
{
公共int PersonID{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
[专栏(“性别”)]
公共字符串性别字符串
{
获取{return-Gender.ToString();}
私有集{Gender=value.ParseEnum();}
}
[未映射]
公共性别{get;set;}
}
以及从字符串中获取正确枚举的扩展方法

public static class StringExtensions
{
    public static T ParseEnum<T>(this string value)
    {
        return (T)Enum.Parse(typeof(T), value, true);
    }
}
公共静态类StringExtensions
{
公共静态T ParseEnum(此字符串值)
{
返回(T)Enum.Parse(typeof(T),value,true);
}
}

有关详细信息,请参阅本文-

确实如此。也许EF7会有一些东西。很好的解决方案。一点注释,一旦使用扩展方法,就可以简单地写-value.ParseEnum(),而不是EnumExtensions.ParseEnum(value)。