【问题标题】:LINQ .ToListAsync failing when using two tables使用两个表时 LINQ .ToListAsync 失败
【发布时间】:2016-01-13 17:54:44
【问题描述】:

我的函数在不运行异步时可以正常工作,但是当我尝试将其更改为 .ToListAsync() 时它会失败并显示

"ObjectContext 实例已被释放,不能再被释放 用于需要连接的操作"

以下是失败的...

public async void UpdateNoAction()
{
    await (from r in Context.CodingReview
       from s in Context.UserDetails.Where(s => s.reviewId = r.id)
       where ...
       select new ExtendedDetails(){
           Review = r,
           Spell = s
       }).ToListAsync();
}

上下文是一个实体框架数据库连接。返回类型是无效的,所以我实际上得到了错误消息,而不是静默失败,但稍后将更改为 bool。

如果我出于测试目的删除 Context.UserDetails 部分,它可以正常工作。关于它为什么会失败的任何想法?

【问题讨论】:

  • 向我们展示您的完整方法。
  • 你的情况是什么上下文?它似乎是一个数据库连接,您在异步方法完成之前关闭/处置它。
  • Context的生命周期是什么?

标签: c# linq


【解决方案1】:

问题很可能与async void 的使用有关。 我猜您正在以其他方法打开连接并在该方法中调用此方法并关闭连接。 async void 类型方法是 fire and forget 类型,这意味着在执行完成之前方法返回;那么您的数据库连接可能会在此方法完成其操作之前关闭。

将方法签名从public async void UpdateNoAction()更新为public async Task UpdateNoAction()public async Task<List<ExtendedDetails>> UpdateNoAction();那我想问题会解决的。

【讨论】:

  • 更改类型确实会停止出现错误消息,但随后查询会静默失败。
  • 你可以在没有 async 关键字的情况下调试并检查函数是否正确返回(删除 async 关键字并使用 ToList 更改 ToListAsync)?
  • 等一下,你说得对,我没有让父函数异步,它的返回类型也是 void。改变了它,它再次正常工作。谢谢:)
猜你喜欢
  • 2018-05-29
  • 2020-09-28
  • 2018-06-06
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多