无法创建类型为“EShop.ClassLibrary.ProductType”的常量值。此上下文仅支持原始类型或枚举类型

Posted

技术标签:

【中文标题】无法创建类型为“EShop.ClassLibrary.ProductType”的常量值。此上下文仅支持原始类型或枚举类型【英文标题】:Unable to create a constant value of type 'EShop.ClassLibrary.ProductType'. Only primitive types or enumeration types are supported in this context 【发布时间】:2014-12-14 19:20:04 【问题描述】:

我有这 2 个类,产品与 ProductType 相关,但是当使用下面的代码时,我看到以下错误。

无法创建“EShop.ClassLibrary.ProductType”类型的常量值。此上下文仅支持原始类型或枚举类型

它们与 ProductType LinkProductTypeId 相关

 public class Product

    [Key]
    public virtual int ProductID  get; set; 
    public virtual ProductType LinkProductTypeId  get; set; 
    public virtual string Name  get; set; 
    public virtual string EngName  get; set; 
    public virtual RelatedProduct ProductRelated  get; set; 
    public virtual decimal BuyCost  get; set; 
    public virtual decimal SellCost  get; set; 

 public class ProductType

    public virtual int ProductTypeId  get; set; //id in ef
    public virtual string Name  get; set; 

运行时代码是这样的:

 public static List<SelectListItem> GetProductSelectList()
    
        ProductType type = _db.productType.Single(t => t.ProductTypeId == 1);
        List<Product> m = (_db.product.Where(r => r.LinkProductTypeId == type) ).ToList();//error line

        List<SelectListItem> sa = new List<SelectListItem>();
        foreach (Product item in m)
        
            sa.Add(new SelectListItem  Text = item.Name, Value = item.ProductID.ToString() );
        

        return sa;
    

【问题讨论】:

一句警告。寻求帮助时,您需要传递所有信息。例如,“但它失败了”并没有告诉“它是如何失败的”,也没有告诉它失败的地方(哪一行引发了异常)。阅读:***.com/help/how-to-ask。 【参考方案1】:

我认为你要处理的问题是下面这行代码:

List<Product> m = (_db.product.Where(r => r.LinkProductTypeId == type)).ToList();

您似乎在那里尝试获得所有LinkProductTypeId 等于type 的产品,您之前已经获得过。可能您无法使用相等运算符解决这些对象的相等性。

我建议使用ProductTypeId 这样做。代码方面:

List<Product> m = (_db.product.Where(r => r.LinkProductTypeId.ProductTypeId == 
                                          type.ProductTypeId)).ToList();

如果ProductTypeId 对于每个ProductType 来说都是唯一的,看起来就是这样,那么上面的内容就可以完成你的工作。

为什么上面的有效,而前面的无效?

上述方法有效,因为您只是比较比较两个整数,如果它们具有相同的值,则 Where 中的谓词返回 true 并且当前项目将包含在列表中。

前面的不行,因为==在两个引用类型之间是在寻找引用相等而不是为了对象的对应字段有相同的值。

让我们有一个类

public class Customer 

    public string FirstName  get; set;       
    public string LastName  get; set; 
    public int Age  get; set; 

    public Customer(string firstName, string lastName, int age)
    
        FirstName = firstName;
        LastName = lastName;
        Age = age;
    

然后是这个控制台应用

public class Program


    public static void Main()
    
        var customerA = new Customer("firstname","lastname",22);
        var customerB = new Customer("firstname","lastname",22);

        Console.WriteLine(customerA==customerB);
    

将输出false,因为尽管customerAcustomerB 的所有值都具有相同的值,但customerAcustomerB 是两个不同的对象。请看here。

【讨论】:

@user3480060 你欢迎老兄!我很高兴能帮上忙。

以上是关于无法创建类型为“EShop.ClassLibrary.ProductType”的常量值。此上下文仅支持原始类型或枚举类型的主要内容,如果未能解决你的问题,请参考以下文章

实体框架,无法创建类型为“XX”的常量值。此上下文仅支持原始类型或枚举类型

无法创建类型为“EShop.ClassLibrary.ProductType”的常量值。此上下文仅支持原始类型或枚举类型

EVReflection + Moya + Realm + RxSwift - 无法为 dict 类型创建实例

无法为 Net Core 3.1 WPF 应用程序创建类型为“DbContext”的对象

DbContext.set() 无法为实体创建 DbSet,因为此类型未包含在上下文的模型中

无法为“ApplicationUser”创建 DbSet,因为此类型未包含在上下文模型中