我无法使用Entity Framework从数据库中检索实体。我有一个名为 Order 的实体。为了检索记录,我做了:
public IQueryable<Order> GetOrder(int id) {
return Context.Orders.Where(e => e.Id == id);
}
当我使用ViewModel模式时,我需要将 Order 实体转换为 OrderDTO ,所以我像这样进行转换:
return orderManager.GetOrder(id).ToList().AsQueryable().ProjectTo<OrderDTO>().ToList();
问题是,当我进行此转换时,我收到一条错误消息:
''订单'上的' PaymentMethod '属性无法设置为 'System.String'值。您必须将此属性设置为非null值 类型' PaymentMethod '。
调试,我发现当我执行 ToList()时会发生这种情况。例如:
public IQueryable<Order> GetOrder(int id) {
var test = Context.Orders.Where(e => e.Id == id).ToList(); // fatal error
return Context.Orders.Where(e => e.Id == id);
}
关于此错误的Google搜索,this是我找到的唯一相关信息,但我不确定是否必须执行该博客中解释的更改。我也尝试了这个,但它没有用:
return Context.Orders.Include(e => e.)... //Nothing appears in Intellisense
//or
return Context.Orders.Include("PaymentMethod")...
我的代码:
PaymentMethod 是这样的枚举:
public enum PaymentMethod
{
PayPal,
CreditCard,
Transfer
}
订单实体基本上就是这样(它更大但是没关系):
public class Order
{
public int Id { get; set; }
public List<OrderLine> OrderLines { get; set; }
public DateTime? PaymentDate { get; set; }
public PaymentMethod PaymentMethod { get; set; }
}
答案 0 :(得分:2)
return orderManager.GetOrder(id).ToList().AsQueryable().ProjectTo<OrderDTO>().ToList();
这里,调用ToList功能可以防止投影。 那是对的:
return orderManager.GetOrder(id).ProjectTo<OrderDTO>().ToList();
枚举在EF中被视为数字(int),而不是字符串。