实体框架在释放 ObjectContext 后检查虚拟列表

本文关键字:检查 虚拟 列表 ObjectContext 框架 释放 实体 | 更新日期: 2023-09-27 17:57:11

我的场景是我有一个对象FOO它有一个virtual List<bar>属性。这是由 EF 自动生成的。

加载FOO释放数据上下文后,我通过 DTO 将FOO转换为业务对象。例如

var newFOO = FOO_Dto.change(FOO);

FOO_Dto.change里面,我想检查虚拟列表属性是否为空/空。我知道关闭对象上下文并检查导航属性会引发错误。在我的数据层中,有时我返回FOO时会带有列表,而返回FOO时没有列表。

我的问题是如何检查导航属性以查看列表是否已填充并避免当前生成的 ObjectContext 错误

谢谢!!

编辑

在评论部分,我特意希望在检查是否加载List<Bar>属性之前关闭上下文。

实体框架在释放 ObjectContext 后检查虚拟列表

不,你不能,除了尝试和捕获异常的丑陋方式。您只能通过获取所有者的DbEntityEntry来确定是否加载集合,您只能通过上下文实例获取。

但是,如果您事先知道集合可能在上下文范围之外寻址,则需要在上下文处于活动状态时加载它,或者不加载它并防止延迟加载。切勿允许延迟加载发生在上下文的生命周期之外。

在大多数情况下,这意味着您必须关闭延迟加载并急切地加载使用方法所需的所有数据。

我以断开连接的方式使用 EF 的次数越多,我允许延迟加载的次数就越少。我接近考虑延迟加载反模式。