1

所以我有一个查询的小问题,我必须返回一个项目列表。这是查询:

 geographic = _iRepository.Geographics.Where(p => p.GeographID == ID)
                             .SingleOrDefault()
                             .Children
                             .SingleOrDefault()
                             .Children
                             .OrderBy(p => p.DisplayOrder).ThenBy(p => p.Name)
                             .ToList();

ID(以及 GeographID)都是 guid。问题是我的查询卡在 == 部分,这意味着它永远找不到匹配项。如果我在这部分代码设置断点,在它退出后,它会给我以下错误:

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection

这很奇怪,因为我在其他地方有完全相同的代码,而且效果很好!我应该补充一下,我正在使用带有实体框架的 MVC 4,这是一个 Web Api 控制器(或者是从 Web Api 派生的)。我已经研究并听说我可以做到,Lazy Loading但我不确定它是如何工作的。

我感谢任何和所有的帮助!

4

2 回答 2

1

该错误表明您已处置 DbContext 对象。检查您的控制器代码。

也许这是使用脚手架创建控制器的原因。如果是这样,请检查控制器代码以找到类似以下内容:

protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }

要么删除它(不推荐),要么在它之前调用你的 DbContext 对象。

或者您可能手动处置您的对象,或者通过using()子句声明您的对象等。无论如何,发生此错误是因为您在处置后调用了该对象。检查你的代码...

更新:

另一个猜测:您似乎在查询中使用了导航属性。如果是这样,在这种情况下,您应该包括您需要的任何 NavPr。尝试这样的事情:

geographic = _iRepository.Geographics.Include("NavPr1")
    .Include("NavPr2").Include("NavPr2.NavPr21")
    .Where(p => p.GeographID == ID)
    .SingleOrDefault()        
     // and the rest of query...
于 2013-07-26T17:53:11.323 回答
0

由于某种原因,上面的查询不起作用,我尝试的所有其他方法都以相同的方式工作(对象被处理)。所以我决定使用附加的查询。这不是一个“解决方案”,但它确实完成了工作。感谢所有帮助:

geographic = (from g1 in _iEMARepository.Geographics
                             join g2 in _iEMARepository.Geographics
                                on g1.GeographID equals g2.ParentId
                            join g3 in _iEMARepository.Geographics
                                on g2.GeographID equals g3.ParentId
                             where g1.GeographID == ID
                              select g3).OrderBy(p => p.DisplayOrder).ThenBy(p => p.Name).ToList();
于 2013-07-30T20:44:19.887 回答