ASP.net Linq查询InvalidOperationException:类''没有无参数构造函数

时间:2018-05-02 12:54:03

标签: c# asp.net linq linq-to-sql

标题几乎解释了它,走了几个小时,回来做了一些编码,运行它,没有工作。所以我几乎清除了它。现在我收到这个错误。 InvalidOperationException:类'ClientApp.Models.Product'没有无参数构造函数。它突出了这段代码

List<Product> query = (from p in _db.Products
                                   where list.Contains(p.SubCategoryID)
                                   select p).ToList(); 

完整方法

public List<Product> GetProducts()
{
    var _db = new ClientApp.Models.ProductContext();
    IEnumerable<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };
    List<Product> query = (from p in _db.Products
                           where list.Contains(p.SubCategoryID)
                           select p).ToList();
    return query;

}

产品类(使用ADO.NET实体)

[Table("Product")]
    public partial class Product
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Product(int productId)
        {
            OrderDetails = new HashSet<OrderDetail>();
        }

        public int ProductID { get; set; }

        public int RetailerID { get; set; }

        public int SubCategoryID { get; set; }


        [Required]
        [StringLength(50)]
        public string ProductName { get; set; }

        [Required]
        [StringLength(255)]
        public string ProductDescription { get; set; }

        [Column(TypeName = "money")]
        public decimal Price { get; set; }

        public int UnitsInStock { get; set; }

        public byte[] Picture { get; set; }

        public bool? IsDiscontinued { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<OrderDetail> OrderDetails { get; set; }

        public virtual ProductSubCategory ProductSubCategory { get; set; }
    }

完整错误代码如下: System.Reflection.TargetInvocationException:'调用目标已抛出异常。' InvalidOperationException:类'ClientApp.Models.Product'没有无参数构造函数。

直到几个小时之前,我才完美地工作,在我做出一些改变之前,现在它完全被打破了。我已经完成了尽可能多的回溯,我无法解决这个问题,谷歌也找不到任何解决方案......任何想法?

3 个答案:

答案 0 :(得分:3)

修复问题更改

public Product(int productId)
{
    OrderDetails = new HashSet<OrderDetail>();
}

public Product()
{
    OrderDetails = new HashSet<OrderDetail>();
}

productId参数未在构造函数中使用,因此不需要

至于为什么它曾经工作以及它为什么现在没有,我能提供的唯一建议是曾经有一个默认的构造函数。您意外删除了它,将productId参数添加到它,或者它可能是在该类的其他部分声明中。

编辑: 另外,如果根本没有构造函数(有或没有参数),那么C#编译器会为你添加一个。默认值不带参数,没有任何功能。

答案 1 :(得分:0)

您的错误代码:“类'ClientApp.Models.Product'没有无参数构造函数。

尝试设置无参数构造函数。

例如:

 public Product()
 {

 }

答案 2 :(得分:0)

实体框架需要一个空的默认构造函数(即没有参数的构造函数),以便在对底层数据库进行查询操作期间初始化实体(在本例中为Product)。

只需像其他人建议的那样添加一个空构造函数,或从现有构造函数中删除该参数。辅助功能与EF无关,因此除非您希望能够在代码中的其他位置使用默认构造函数初始化类,否则可以将其设置为私有,以防止其他人以非预期的方式访问该类。

    private Product()
    {

    }

为什么会这样?

无论出于何种原因,您的Product实体都引入了非空构造函数。当存在非空构造函数时,编译器认为您不希望在未定义特定构造函数时公开C#类中始终存在的默认无参数构造函数。由于编译器认为您不再需要默认构造函数,因此它不会为您添加一个。 EF需要一个默认的无参数构造函数,不幸的是,它只会在运行时显示出来。