17

我们在解决方案中使用 EF CF 已有一段时间了。大粉丝!到目前为止,我们一直在使用 hack 来支持枚举(在模型上创建一个额外的字段;在映射期间忽略枚举;并将额外的字段映射到我们将使用的数据库中的列)。传统上,我们一直将枚举作为字符串(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.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

几周前我遇到了这个问题。我能想到的最好的办法就是有点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/

于 2014-11-27T04:41:19.063 回答