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