C# 使用语句和实体框架
只要我不使用注释掉的using语句,下面的代码就可以工作。使用using I get时,操作无法完成,因为DbContext已被释放 我最初的预感是,Using是在LINQ查询之后处理DbContext的,但我在将.Dipose放在finally块中时遇到了相同的错误C# 使用语句和实体框架,c#,entity-framework,C#,Entity Framework,只要我不使用注释掉的using语句,下面的代码就可以工作。使用using I get时,操作无法完成,因为DbContext已被释放 我最初的预感是,Using是在LINQ查询之后处理DbContext的,但我在将.Dipose放在finally块中时遇到了相同的错误 这是怎么回事?我已经有一段时间没有在C语言中工作了,所以我可能错过了一些简单的东西。LINQ提供程序使用的实体框架。这意味着在迭代IQueryable之前,不会在数据库上执行查询 所发生的事情是,在您的上下文被释放之后,某个东西会
这是怎么回事?我已经有一段时间没有在C语言中工作了,所以我可能错过了一些简单的东西。LINQ提供程序使用的实体框架。这意味着在迭代IQueryable之前,不会在数据库上执行查询 所发生的事情是,在您的上下文被释放之后,某个东西会迭代您的queryable,从而导致它尝试执行数据库查询 您可以通过调用ToList强制它立即执行
LINQ提供程序使用的实体框架。这意味着在迭代IQueryable之前,不会在数据库上执行查询 所发生的事情是,在您的上下文被释放之后,某个东西会迭代您的queryable,从而导致它尝试执行数据库查询 您可以通过调用ToList强制它立即执行 +1 ti@jrummell。出现该错误的原因是,当using中声明的变量离开该作用域时,会对其调用.Dispose,从而释放DbContext 如果以后尝试执行,DbContext将不再存在。+1 ti@jrummell。出现该错误的原因是,当using中声明的变量离开该作用域时,会对其调用.Dispose,从而释放DbContext
如果以后尝试执行,DbContext将不再存在。谢谢,成功了。是否存在导致执行但返回IQueryable类型集合的等效方法?或者我必须将返回的列表转换回IQueryable吗?我不这样认为。我倾向于认为IQueryable是一个未执行的查询,因此我认为它是合适的。其他将执行IQueryable查询的方法有,等等。谢谢,完成了。是否存在导致执行但返回IQueryable类型集合的等效方法?或者我必须将返回的列表转换回IQueryable吗?我不这样认为。我倾向于认为IQueryable是一个未执行的查询,因此我认为它是合适的。执行IQueryable查询的其他方法有,等等。您确定在这里适用吗?原始代码仍然在使用{}的上下文中;更像是由于延迟执行而尚未创建DbContext。@Jelling:他返回IQueryable,因此可能有人在using语句的上下文之外对其进行了迭代。您确定这在这里适用吗?原始代码仍然在使用{}的上下文中;更像是由于延迟执行而尚未创建DbContext。@Jelling:他返回IQueryable,因此可能有人在using语句的上下文之外对其进行了迭代。
public IQueryable<DTOs.FormQuestionDTO> GetForm(int id, int page = 0)
{
// FS stores pages starting with 1
page = page == 0 ? 1 : page;
//using (var db = new Models.FormEntities())
//{
var db = new Models.FormEntities();
var questions = from fq in db.FormQuestions
join q in db.Questions on fq.QuestionId equals q.QuestionId
where (fq.FormId == id) && (fq.PageNumber == page) && fq.Disabled == false
orderby fq.DisplayOrder
select new { q.QuestionId, q.QuestionText, fq.DisplayOrder, fq.PageNumber };
var dto = questions.Project().To<DTOs.FormQuestionDTO>();
if (questions == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
return dto;
}
//}
}
var dto = questions.Project().To<DTOs.FormQuestionDTO>().ToList();