【发布时间】:2010-12-19 18:11:16
【问题描述】:
在遇到 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”中的参数“T”。 Types.StructuralTypeConfiguration.Property(System.Linq.Expressions.Expression>)' [截断路径]
【问题讨论】:
-
查看我的帖子进行第二次编辑,希望得到您寻求的答案
-
我关闭了它,因为 EF 在 EF5.0/.NET 4.5 (blogs.msdn.com/b/adonet/archive/2011/10/18/…) 之前不会有适当的枚举支持。此外,CTP5 早就让这个问题变得多余了。
标签: c# entity-framework entity-framework-4 ef-code-first