【问题标题】:Entity Framework: Unable to create a constant value of type **. Only primitive types or enumeration types are supported in this context实体框架:无法创建类型为 ** 的常量值。此上下文仅支持原始类型或枚举类型
【发布时间】:2016-11-06 01:17:26
【问题描述】:

我有这个问题:

     public override IEnumerable<Order> ExecuteQuery(MovieRentalContext database)
    {

        return from order in database.Orders
            where (customer == null || customer.Id == order.CustomerId)
            select order;
    }

customer 是类中的字段。 有订单类

   public class Order: Entity
{
    [Required]
    public Copy Copy { get; set; }

    public Customer Customer { get; set; }
    public DateTime OrderDate { get; set; }
    public DateTime EstimatedReturnDate { get; set; }
    public Salesman Salesman { get; set; }

    public DateTime? ActualReturnDate { get; set; }
    public decimal Price { get; set; }

    [ForeignKey("Customer")]
    public long CustomerId { get; set; }
}

实体包含 ID。我想获取客户的订单,但在执行期间抛出异常:

无法创建 >'MovieRental.DataAccess.Models.Customer' 类型的常量值。此上下文仅支持原始类型或枚举类型。

我尝试了所有找到的方法,但仍然无法正常工作。有什么问题?

【问题讨论】:

  • InnerException 说什么?转到异常的详细信息。
  • 您的customer 变量是什么?它是在哪里定义的?

标签: c# entity-framework


【解决方案1】:

我会说您的customer == null 代码导致了这种情况。 EF 正在尝试将其转换为 SQL,但客户不在该上下文中。尝试将该条件排除在查询之外。

public override IEnumerable<Order> ExecuteQuery(MovieRentalContext database)
{
    if (customer != null)
    {
        return from order in database.Orders
            where order.CustomerId == customer.Id
            select order;
    }
    else
    {
        return from order in database.Orders
            select order;
    }

}

【讨论】:

  • 这个问题的目的不是修复 NullReferenceException
  • @CodeNotFound - 我认为不是。不确定自己,所以我不发布答案,但通过类似的问题,这个答案似乎是正确的(再次,据我所知)
  • @Mladen Mihajlovic - 您可以通过将else 的查询分配给变量来改进它,然后使用if 语句来检查客户。在if 的范围内添加where 并最终返回
  • 啊 :) 你是对的@GiladGreen。我认为在客户和订单实体之间加入。似乎客户不是一个实体。所以这个答案可能是正确的答案。
  • @GiladGreen 我个人认为整个方法写得不好。任何查看名为 ExecuteQuery 的方法的人都不会知道它正在使用客户(其范围之外的字段)。这可能应该是 2 个单独的方法 - GetAllOrders() 和 GetCustomerOrders(Customer c)。但我只是想解释他的直接问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 2013-04-30
  • 2015-08-26
相关资源
最近更新 更多