Asp.net mvc 查询未返回结果(但结果存在且查询在不同项目中工作)
所以我有一个查询的小问题,我必须返回一个项目列表。以下是查询:Asp.net mvc 查询未返回结果(但结果存在且查询在不同项目中工作),asp.net-mvc,entity-framework,asp.net-mvc-4,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,所以我有一个查询的小问题,我必须返回一个项目列表。以下是查询: geographic = _iRepository.Geographics.Where(p => p.GeographID == ID) .SingleOrDefault() .Children .SingleOrDefault()
geographic = _iRepository.Geographics.Where(p => p.GeographID == ID)
.SingleOrDefault()
.Children
.SingleOrDefault()
.Children
.OrderBy(p => p.DisplayOrder).ThenBy(p => p.Name)
.ToList();
ID(以及地理位置)都是GUI。问题是我的查询在==部分卡住了,这意味着它永远找不到匹配项。如果我在代码的这一部分设置了断点,在它退出后,它会给出以下错误:
The ObjectContext instance has been disposed and can no longer be used for operations that require a connection
这很奇怪,因为我在其他地方有完全相同的代码,它工作得非常完美!我应该补充一点,我使用的是带有实体框架的MVC4,这是一个WebAPI控制器(或者是从WebAPI派生的)。我已经研究并听说我可以做延迟加载
,但我不确定它是如何工作的
我感谢所有的帮助 错误表示您已释放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...
错误表明您已释放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...
由于某种原因,上面的查询无法工作,我尝试的其他所有查询都以相同的方式工作(对象被处置)。所以我决定使用附加的查询。这不是一个“解决方案”,但它确实完成了工作。感谢您的帮助:
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();
由于某种原因,上面的查询无法工作,我尝试的其他所有查询都以相同的方式工作(对象被处置)。所以我决定使用附加的查询。这不是一个“解决方案”,但它确实完成了工作。感谢您的帮助:
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();
我可以在这里发布我的控制器内部的完整操作,实际上没有任何东西可以“处置”对象。我这么说的原因是,我有一个几乎完全相同的查询副本(而不是使用GeographID,我使用Name属性),并且没有遇到这个问题。这和Web Api有什么关系吗?对不起,如果我不知道你所说的NavPr是什么意思,但你能解释一下它是什么吗。谢谢你只是导航属性。。。我的缩写是。。。!我明白了,我试试看。谢谢你的帮助!这一定是问题的原因。尝试查找导致此错误的NavPr,并将其包括在内。看看另一个有效的查询,看看你没有在那里使用什么NavPr…我可以在我的控制器中发布完整的操作,实际上没有任何东西可以“处理”对象。我这么说的原因是,我有一个几乎完全相同的查询副本(而不是使用GeographID,我使用Name属性),并且没有遇到这个问题。这和Web Api有什么关系吗?对不起,如果我不知道你所说的NavPr是什么意思,但你能解释一下它是什么吗。谢谢你只是导航属性。。。我的缩写是。。。!我明白了,我试试看。谢谢你的帮助!这一定是问题的原因。尝试查找导致此错误的NavPr,并将其包括在内。看看另一个有效的查询,看看你没有使用的NavPr…哦,对不起!将所有
.Include()
s放在之前。Where()
在调试EF代码时,我也会看到此错误。这通常意味着查询中存在错误,但会引发此错误。为了解决实际问题,我将查询拆分,一步一步地执行,每次都转换ToList()
。最终你会在代码中发现问题,当你把代码重新组合在一起时,上面看到的错误就会消失。哦,对不起!将所有.Include()
s放在之前。Where()
在调试EF代码时,我也会看到此错误。这通常意味着查询中存在错误,但会引发此错误。为了解决实际问题,我将查询拆分,一步一步地执行,每次都转换ToList()
。最终,您会在代码中发现问题,当您重新组合代码时,上面看到的错误将消失。