我正在尝试使用 .ToListAsync() 在 DbContext 的 using 语句中获取 linq 查询结果,代码:

private async Task<List<String>> GetEntiteesAsync()
{
     Task<List<String>> returnValue;

     using (var entities = new REPORTEntities())
     {
          returnValue = (from user in entities.USERs
                         group user by user.entite into g
                               select g.Key).ToListAsync();
     }

     return await returnValue;
}

运行时,我得到“ObjectContext 实例已被释放,不能再用于需要连接的操作。”如图所示 :

我想这是由于在 returnValue 对象仍然以列表的形式异步接收对象时 Context 已被释放,是否有解决方法可以在保留 using 语句的同时避免此错误,或者我应该这样做:
private async Task<List<String>> GetEntiteesAsync()
{
     Task<List<String>> returnValue;

     var entities = new REPORTEntities()

     returnValue = (from user in entities.USERs
                    group user by user.entite into g
                    select g.Key).ToListAsync();

     return await returnValue;
}

最佳答案

您将在 using 操作完成之前离开 ToListAsync 作用域,因为您没有等待异步任务,这意味着 entities 被释放得太快(因此对象已释放异常)。

您应该只在范围内返回结果,async-await 机制将确保在操作异步完成后调用 Dispose:

private async Task<List<String>> GetEntiteesAsync()
{
     using (var entities = new REPORTEntities())
     {
          return await (from user in entities.USERs
                         group user by user.entite into g
                               select g.Key).ToListAsync();
     }
}

关于c# - ToListAsync() 在 DbContext 中使用语句 : "The ObjectContext disposed", 如何处理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27214182/

10-11 23:15