是否可以在 EF 5 中将枚举存储为字符串



我们在解决方案中使用EF CF已经有一段时间了。大粉丝!到目前为止,我们一直在使用 hack 来支持枚举(在模型上创建一个额外的字段;在映射期间忽略枚举;并将额外的字段映射到我们将使用的 db 中的列)。传统上,我们一直将枚举作为字符串(varchars)存储在数据库中(使其美观且可读)。现在有了 EF 5(Beta 2)中的枚举支持,看起来它只支持将枚举映射到数据库中的 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: 成员 指定的映射无效。类型 'Dodson.Data.DataAccess.EFRepositories.DocumentType[Nullable=False,DefaultValue=]' 成员类型中的"类型" 'Dodson.Data.DataAccess.EFRepositories.Workflow' 不兼容 跟 'SqlServer.varchar[Nullable=False,DefaultValue=,MaxLength=8000,Unicode=False,FixedLength=False]' 成员"类型"中的"代码第一数据库架构.工作流"。

你的想法?

目前这是不可能的。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; }
}

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

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/

最新更新