c# - 为什么在我使用 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 注入。
解决方案
请记住,LINQ 是延迟执行的——那是您实际使用信息的时候。问题可能是,您的 DbContext 已超出范围......
此时使用.ToList()或.ToArray()强制执行。
推荐阅读
- java - 通过 Maven 添加 DB2 JDBC 驱动程序
- neo4j - 127.0.0.1:8001 在 kubectl 代理访问 kubernetes 仪表盘时拒绝连接
- json - Python3:从 json 格式添加相等的元素
- spring-boot - Spring Boot 2 集群与一个数据库实例
- macros - 在宏中嵌套 eval 调用是不好的做法吗?
- android - 通过指定边界框实现地图下载
- google-cloud-platform - 如何使用谷歌云启动 Apache 网络服务器?
- c# - 如何使用 c# 将 system.io 流对象输入到 ffmpeg
- java - Java猜数字游戏(不带扫描仪)
- c++ - 传递大括号初始化器列表参数时调用可变参数函数模板的问题