我们在解决方案中使用EF CF已有一段时间了。大粉丝!到目前为止,我们一直在使用hack来支持枚举(在模型上创建一个额外的字段;忽略enum durring映射;并将额外的字段映射到我们将使用的db中的列)。传统上我们一直将我们的枚举存储为DB中的字符串(varchars)(使其变得美观和可读)。现在,在EF 5(Beta 2)中支持enum,看起来它只支持将枚举枚举到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");
}
}
我认为这将成为神奇的子弹但是......
只是抛出:
指定的架构无效。错误:(571,12):错误2019:成员 指定的映射无效。类型 &#39; Dodson.Data.DataAccess.EFRepositories.DocumentType [可空=假,默认值=]&#39; 会员&#39;类型&#39;在类型 &#39; Dodson.Data.DataAccess.EFRepositories.Workflow&#39;不兼容 同 &#39; SqlServer.varchar [可空=假,默认值=,的MaxLength = 8000,的Unicode =假,定长= FALSE]&#39; 会员&#39;类型&#39;在类型&#39; CodeFirstDatabaseSchema.Workflow&#39;。
你的想法?
答案 0 :(得分:16)
目前无法做到这一点。 EF中的枚举与CLR中的枚举具有相同的限制 - 它们只是命名的整数值集。检查this article以确认:
EF枚举类型定义存在于概念层中。与...类似 CLR枚举EF枚举的底层类型是Edm.SByte, Edm.Byte,Edm.Int16,Edm.Int32或Edm.Int64与Edm.Int32是 默认底层类型,如果没有指定。
我发布了关于此问题的article和related suggestion。如果您希望将来看到此功能,请投票赞成该建议。
答案 1 :(得分: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/