首页 > 解决方案 > C# - 无法从数据库中检索实体

问题描述

我无法使用实体框架从数据库中检索实体。我有一个名为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();

问题是,当我进行此转换时,我收到一条错误消息:

“ Order ”上的“ PaymentMethod ”属性无法设置为“System.String”值。您必须将此属性设置为“ 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);
}

谷歌搜索此错误,是我找到的唯一相关信息,但我不确定是否必须进行该博客中解释的更改。我也试过这个,但没有奏效:

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; }
}

标签: c#entity-frameworkenums

解决方案


return orderManager.GetOrder(id).ToList().AsQueryable().ProjectTo<OrderDTO>().ToList();

在这里,调用 ToList 函数会阻止投影。这是正确的:

return orderManager.GetOrder(id).ProjectTo<OrderDTO>().ToList();

并且枚举在 EF 中被视为数字 (int),而不是字符串。


推荐阅读