首页 > 解决方案 > 为什么在我使用 FindAsync() 在实体框架中尝试此 LINQ 查询之前 DbContext 关闭?

问题描述

我在一个使用 EF、代码优先方法和 ODP.Net (Oracle) 的团队中。我们需要尝试将更新写入表中的多行,并将任何异常存储在集合中以冒泡到处理程序(因此写入不会因为无法写入一条记录而停止)。但是,此代码引发异常说

System.InvalidOperationException:操作无法完成,因为 DbContext 已被释放。

我不确定为什么。如果将方法更改为同步方法并使用.Find().

InvModel _model;

    public InvoiceRepository(InvModel model)
    {
        _model = model;           
    }

    public void SetStatusesToSent(IEnumerable<Invoice> Invoices)
    {


        var exceptions = new List<Exception>();
        foreach (var id in invoices)
        {
            try
            {                    
                var iDL = await _model.INVOICES.FindAsync(id);/*THROWS A DBCONTEXT EXCEPTION HERE*/
                iDL.STATUS = Statuses.Sent; // get value from Statuses and assign                   
                _model.SaveChanges(); //save changes to the model
            }
            catch (Exception ex)
            {
                exceptions.Add(ex);
                continue; //not necessary but makes the intent more legible
            }
        }
     }

附加细节更新: _model由 DI 注入。

标签: c#entity-frameworklinqasync-await

解决方案


请记住,LINQ 是延迟执行的——那是您实际使用信息的时候。问题可能是,您的 DbContext 已超出范围......

此时使用.ToList().ToArray()强制执行。


推荐阅读