遇到 Entity Framework 4中缺乏enum
属性支持的问题后,我发现这篇文章描述了一种解决方法:
如何OrderStatusWrapper
在代码中而不是在设计器中表达数据库列到(如文章中所述)的映射?
更新:
根据提供的答案,我没有意识到我需要OrderStatus
用类型替换枚举OrderStatusWrapper
,即
代替:
public class Order
{
public OrderStatus Status { get; set; }
}
我应该使用:
public class Order
{
public OrderStatusWrapper Status { get; set; }
}
这让我更进一步,但是在执行以下代码时:
// OrderContext class defined elsewhere as:
// public class OrderContext : DbContext
// {
// public DbSet<Order> Orders { get; set; }
// }
using(OrderContext ctx = new OrderContext())
{
Order order = new Order { Status = OrderStatus.Created; }
ctx.Orders.Add(order);
ctx.SaveChanges();
}
引发以下异常(为简洁起见):
System.Data.SqlClient.SqlException 消息=无效的列名“值”。
数据库列名为Status
。我尝试用以下方式装饰Status
房产:
[Column("Status")]
然后
[Column("Status"), TypeName("OrderStatus")]
和
[Column("Status"), TypeName("OrderStatusWrapper")]
但这并不能解决此异常。
我还尝试删除该Column
属性并执行此操作:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>()
.Property(p => p.OrderStatus)
.HasColumnName("OrderStatus");
}
但我得到以下编译错误:
错误 1 类型“ConsoleApplication1.OrderStatusWrapper”必须是不可为空的值类型,才能在泛型类型或方法“System.Data.Entity.ModelConfiguration.Configuration.Types.StructuralTypeConfiguration.Property( System.Linq.Expressions.Expression>)' [截断路径]