我的方案是我有一个对象FOO
,其上有virtual List<bar>
属性。这是由EF自动生成的。
我加载FOO
后处理数据上下文,我通过DTO将FOO
转换为业务对象。例如
var newFOO = FOO_Dto.change(FOO);
FOO_Dto.change
内部我想检查虚拟列表属性是否为空/空。 我知道关闭ObjectContext并检查导航属性会引发错误。在我的数据层中,有时我会将FOO
与列表一起返回,而FOO
则不返回列表。
我的问题是如何检查导航属性以查看列表是否已填充,并避免当前正在生成的ObjectContext错误
非常感谢!!
修改
在评论部分,我特意希望在检查是否加载List<Bar>
属性之前关闭上下文。
答案 0 :(得分:1)
不,你不能,除了尝试和捕捉异常的丑陋方式。您只能通过获取所有者的DbEntityEntry
来确定是否加载了集合,您只能通过上下文实例获取该集合。
但是如果您事先知道集合可能在上下文范围之外被解决,则需要在上下文处于活动状态时加载它,或者不加载它并防止延迟加载。永远不要允许延迟加载在上下文的生命周期之外发生。
在大多数情况下,这意味着您必须关闭延迟加载并急切加载使用方法所需的所有数据。
我越是以断开连接的方式使用EF,我就越少允许延迟加载。我接近考虑延迟加载反模式。