我可以将枚举作为EF 5串?(Can I store enums as strings in EF

2019-06-23 16:52发布

我们一直在使用EF CF在我们的解决方案一段时间。 忠实粉丝! 到现在为止,我们一直在使用一个黑客以支持枚举(在模型中创建一个额外的字段;忽略枚举durring映射;以及额外的字段映射到我们会用在数据库列)。 传统上我们一直保存我们的枚举作为字符串(VARCHAR处理)在DB(策略的好处和可读性)。 现在,随着EF 5枚举支持(测试版2)它看起来像它仅支持映射枚举为int的列DB ....我们可以得到EF 5到我们的枚举存储为他们的字符串表示。

其中“类型”是类型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 [可空=假,默认值=”的类型成员“类型”“Dodson.Data.DataAccess.EFRepositories.Workflow”与“SqlServer.varchar不兼容[可空=假,默认值=,的MaxLength = 8000,的Unicode =假,定长=假]”的成员 '' 在类型 '类型CodeFirstDatabaseSchema.Workflow'。

你的意见?

Answer 1:

这是目前不可能的。 枚举EF具有同样的局限性,因为CLR枚举 - 他们只是命名为整数值的设定。 检查这篇文章进行确认:

该EF枚举类型定义住在概念层。 类似于CLR枚举的EF枚举具有潜在型这与Edm.Int32是如果已指定没有默认基础类型Edm.SByte,Edm.Byte,Edm.Int16,Edm.Int32或Edm.Int64之一。

我张贴的文章和相关建议这个问题。 如果你想看到在未来该功能,请投票支持的建议。



Answer 2:

我在几个星期前打了这个问题。 我能想出的最好的是一个有点哈克。

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



文章来源: Can I store enums as strings in EF 5?