已经处理了ObjectContext实例 - Winforms Entity Framework

时间:2012-08-09 23:17:23

标签: c# winforms entity-framework

我正在尝试解决此问题,并且已阅读有关此错误的内容,但无法找出解决方案。 我正在使用Entity框架为简单的Products Categories场景构建一个winforms应用程序。 这是我的模型的快照。 Edmx

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中加载产品时,会显示以下错误: enter image description here

你能告诉我导致这个问题的原因吗?

修改 Include做了诀窍,在这个特定的场景中,我更改了GetAllProducts(),如下所示

        public static List<Product> GetAllProducts()
        {
            using (var entity = new SUIMSEntities1())
            {
                List<Product> products = entity.Products.Include("Category").ToList();
                return products;                
            }            
        }

2 个答案:

答案 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>,但访问类别似乎会导致数据库访问。问题是您已经处理了访问数据库所需的上下文。