ASP.NET Linq查询报错:InvalidOperationException,Product类无无参构造函数
解决InvalidOperationException:实体类无参数构造函数问题
这个错误的原因非常直接——你的ClientApp.Models.Product类没有提供无参数构造函数,而Entity Framework(或你正在使用的ORM框架)在执行LINQ查询、映射数据库结果到实体对象时,必须通过无参构造函数来创建实例。
为什么会触发这个错误?
当你执行这段查询代码时:
List<Product> query = (from p in _db.Products where list.Contains(p.SubCategoryID) select p).ToList();
ORM需要为每一条从数据库返回的记录创建一个Product对象。它的工作流程是:先调用无参构造函数初始化对象,再将数据库中的字段值逐一赋值给对象的属性。如果你的Product类只定义了带参数的构造函数,没有无参的,ORM就找不到创建对象的入口,自然会抛出InvalidOperationException。
解决步骤
检查你的Product类构造函数
打开ClientApp.Models.Product类的代码,看看是不是只写了带参数的构造函数,比如这样:public class Product { public int ProductID { get; set; } public string Name { get; set; } public int SubCategoryID { get; set; } // 只有带参数的构造函数 public Product(int productId, string name, int subCategoryId) { ProductID = productId; Name = name; SubCategoryID = subCategoryId; } }添加无参数构造函数
在Product类中添加一个公共的无参数构造函数,就可以解决问题。你可以保留原有的带参数构造函数(如果业务代码需要用到的话):public class Product { public int ProductID { get; set; } public string Name { get; set; } public int SubCategoryID { get; set; } // 新增无参数构造函数,供ORM使用 public Product() { } // 保留业务用的带参数构造函数 public Product(int productId, string name, int subCategoryId) { ProductID = productId; Name = name; SubCategoryID = subCategoryId; } }注意构造函数的访问修饰符
如果你用的是EF Core,无参数构造函数可以是internal(当实体类和DbContext在同一个程序集时),但最稳妥的方式还是设为public,避免权限问题导致ORM无法调用。
修改完成后,重新编译运行你的代码,这个异常应该就会消失了。
内容的提问来源于stack exchange,提问作者invrt
相关产品推荐
相关产品推荐

