我正在尝试解决此问题,并且已阅读有关此错误的内容,但无法找出解决方案。 我正在使用Entity框架为简单的Products Categories场景构建一个winforms应用程序。 这是我的模型的快照。
ProductService类中检索所有产品的代码是
public static List<Product> GetAllProducts()
{
List<Product> products = new List<Product>();
using (var entity = new SUIMSEntities1())
{
products = (from p in entity.Products
select p).ToList();
return products;
}
}
背后的产品代码中的代码是
List<Product> prods=ProductServices.GetAllProducts();
dgvProducts.DataSource = prods;
当我尝试在datagridview中加载产品时,会显示以下错误:
你能告诉我导致这个问题的原因吗?
修改 Include做了诀窍,在这个特定的场景中,我更改了GetAllProducts(),如下所示
public static List<Product> GetAllProducts()
{
using (var entity = new SUIMSEntities1())
{
List<Product> products = entity.Products.Include("Category").ToList();
return products;
}
}
答案 0 :(得分:4)
默认情况下,实体框架(EF)将延迟加载您的Category对象集。因为您的Category对象集是延迟加载的,当稍后某些其他代码引用类别时,EF将尝试加载该集合。但是,此时,您的上下文已被处理,导致您看到的错误。
您需要做的是强制上下文急切地加载您的类别实体集,如下所示:
public static List<Product> GetAllProducts()
{
List<Product> products = new List<Product>();
using (var entity = new SUIMSEntities1())
{
entity.Include("Category"); //force eager loading of Category
products = (from p in entity.Products
select p).ToList();
return products;
}
}
答案 1 :(得分:2)
虽然您要返回List<Product>
,但访问类别似乎会导致数据库访问。问题是您已经处理了访问数据库所需的上下文。