ASP.net Linq 查询 InvalidOperationException: class '' 没有无参数构造函数
ASP.net Linq Query InvalidOperationException: The class '' has no parameterless constructor
标题几乎解释了它,离开了几个小时,回来做了一些编码,运行它,没有用。所以我几乎清除了它。现在我收到这个错误。 InvalidOperationException:class '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;
}
产品class(使用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: 'Exception has been thrown by the target of an invocation.'
InvalidOperationException: class 'ClientApp.Models.Product' 没有无参数构造函数。
直到几个小时前,在我进行一些更改之前,它一直运行良好,现在它完全崩溃了。我已经尽可能多地回溯来解决这个问题,在 google 上也找不到任何解决方案...有什么想法吗?
您的错误代码:"The class 'ClientApp.Models.Product' has no parameterless constructor."
尝试设置无参数构造函数。
例如:
public Product()
{
}
要解决您的问题,请更改
public Product(int productId)
{
OrderDetails = new HashSet<OrderDetail>();
}
到
public Product()
{
OrderDetails = new HashSet<OrderDetail>();
}
构造函数中未使用 productId
参数,因此 不需要 在那里。
至于为什么它以前可以工作而现在为什么不工作,我能提供的唯一建议是曾经有一个默认构造函数。要么你不小心删除了它,给它添加了 productId 参数,要么它在 class.
的其他部分声明中
编辑:
此外,如果根本没有构造函数(带或不带参数),那么 C# 编译器将为您添加一个。一个默认的,没有参数,没有任何功能。
Entity Framework 需要一个空的默认构造函数(即没有参数的构造函数),以便在对基础数据库进行查询操作期间初始化实体(在本例中为 Product)。
只需按照其他人的建议添加一个空构造函数,或者从现有构造函数中删除该参数。可访问性对 EF 无关紧要,因此除非您希望能够在代码的其他位置使用默认构造函数初始化 class,否则可以将其设置为私有以防止其他人访问 class一种意想不到的方式。
private Product()
{
}
为什么会这样?
无论出于何种原因,在您的 Product 实体中引入了一个非空构造函数。当存在非空构造函数时,编译器认为您不想公开在未定义特定构造函数时始终存在于 C# classes 上的默认无参数构造函数。由于编译器认为您不再需要默认构造函数,因此它没有为您添加默认构造函数。 EF 需要一个默认的无参数构造函数,不幸的是,它只会在运行时显示自己。
标题几乎解释了它,离开了几个小时,回来做了一些编码,运行它,没有用。所以我几乎清除了它。现在我收到这个错误。 InvalidOperationException:class '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;
}
产品class(使用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: 'Exception has been thrown by the target of an invocation.' InvalidOperationException: class 'ClientApp.Models.Product' 没有无参数构造函数。
直到几个小时前,在我进行一些更改之前,它一直运行良好,现在它完全崩溃了。我已经尽可能多地回溯来解决这个问题,在 google 上也找不到任何解决方案...有什么想法吗?
您的错误代码:"The class 'ClientApp.Models.Product' has no parameterless constructor."
尝试设置无参数构造函数。
例如:
public Product()
{
}
要解决您的问题,请更改
public Product(int productId)
{
OrderDetails = new HashSet<OrderDetail>();
}
到
public Product()
{
OrderDetails = new HashSet<OrderDetail>();
}
构造函数中未使用 productId
参数,因此 不需要 在那里。
至于为什么它以前可以工作而现在为什么不工作,我能提供的唯一建议是曾经有一个默认构造函数。要么你不小心删除了它,给它添加了 productId 参数,要么它在 class.
的其他部分声明中编辑: 此外,如果根本没有构造函数(带或不带参数),那么 C# 编译器将为您添加一个。一个默认的,没有参数,没有任何功能。
Entity Framework 需要一个空的默认构造函数(即没有参数的构造函数),以便在对基础数据库进行查询操作期间初始化实体(在本例中为 Product)。
只需按照其他人的建议添加一个空构造函数,或者从现有构造函数中删除该参数。可访问性对 EF 无关紧要,因此除非您希望能够在代码的其他位置使用默认构造函数初始化 class,否则可以将其设置为私有以防止其他人访问 class一种意想不到的方式。
private Product()
{
}
为什么会这样?
无论出于何种原因,在您的 Product 实体中引入了一个非空构造函数。当存在非空构造函数时,编译器认为您不想公开在未定义特定构造函数时始终存在于 C# classes 上的默认无参数构造函数。由于编译器认为您不再需要默认构造函数,因此它没有为您添加默认构造函数。 EF 需要一个默认的无参数构造函数,不幸的是,它只会在运行时显示自己。