所以我对查询有这个小问题我必须返回一个项目列表。这是查询:
geographic = _iRepository.Geographics.Where(p => p.GeographID == ID)
.SingleOrDefault()
.Children
.SingleOrDefault()
.Children
.OrderBy(p => p.DisplayOrder).ThenBy(p => p.Name)
.ToList();
ID(以及GeographID)都是guids。问题是我的查询卡在==部分,这意味着它永远找不到匹配。如果我在代码的这一部分设置断点,退出后会给出以下错误:
The ObjectContext instance has been disposed and can no longer be used for operations that require a connection
这很奇怪,因为我在其他地方有完全相同的代码片段而且效果很好!我应该补充一点,我正在使用MVC 4和Entity Framework,这是一个Web Api控制器(或者是从Web Api派生的)。我已经研究过并且听说我可以做Lazy Loading
,但我不确定它是如何工作的。
我感谢所有人的帮助!
答案 0 :(得分: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...
答案 1 :(得分: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();