Joe*_*ear 17 entity-framework entity-framework-5
我们在解决方案中使用EF CF已有一段时间了.大粉丝!到目前为止,我们一直在使用hack来支持枚举(在模型上创建一个额外的字段;忽略enum durring映射;以及将额外字段映射到我们将使用的db中的列).传统上我们一直将我们的枚举存储为DB中的字符串(varchars)(使其变得美观和可读).现在有了EF 5(Beta 2)中的枚举支持,它看起来只支持将枚举枚举到DB中的int列....我们可以让EF 5将我们的枚举存储为它们的字符串表示.
其中"Type"是DocumentType类型的枚举
public enum DocumentType
{
POInvoice,
NonPOInvoice,
Any
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下方法进行映射:
public class WorkflowMap : EntityTypeConfiguration<Model.Workflow.Workflow>
{
public WorkflowMap()
{
ToTable("Workflow", "Workflow");
...
Property(wf => wf.Type).HasColumnType("varchar");
}
}
Run Code Online (Sandbox Code Playgroud)
我以为是魔术子弹但是......
这只是抛出:
指定的架构无效.错误:(571,12):错误2019:指定的成员映射无效.类型'Dodson.Data.DataAccess.EFRepositories.Workflow'中成员'Type'的类型'Dodson.Data.DataAccess.EFRepositories.DocumentType [Nullable = False,DefaultValue =]'与'SqlServer.varchar不兼容[Nullable =在'CodeFirstDatabaseSchema.Workflow'类型中成员'Type'的False,DefaultValue =,MaxLength = 8000,Unicode = False,FixedLength = False]'.
你的意见?
Bry*_*yan 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; }
}
Run Code Online (Sandbox Code Playgroud)
以及从字符串中获取正确枚举的扩展方法.
public static class StringExtensions
{
public static T ParseEnum<T>(this string value)
{
return (T)Enum.Parse(typeof(T), value, true);
}
}
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅此帖子 - http://nodogmablog.bryanhogan.net/2014/11/saving-enums-as-strings-with-entity-framework/