【问题标题】:Entity Framework Check virtual Lists after disposing of ObjectContext实体框架在处理 ObjectContext 后检查虚拟列表
【发布时间】:2014-04-07 06:13:37
【问题描述】:

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

加载FOO 后,我处理了数据上下文,我通过DTO 将FOO 变成了一个业务对象。例如

var newFOO = FOO_Dto.change(FOO);

FOO_Dto.change 内部我想检查虚拟列表属性是否为空/null。 我了解关闭 ObjectContext 并检查导航属性会引发错误。在我的数据层中,有时我会返回带有列表的 FOO 和不带列表的 FOO

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

非常感谢!!

编辑

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

【问题讨论】:

  • 在释放上下文之前调用change方法。
  • @hami770 我看到的唯一方法是上下文中的changetracker
  • @haim770 你能扩展一下,也许提供一些链接? DbContexts methods中的“改变”方法我没见过
  • 我在你的FOO_Dto.change(FOO) 之后写了changeDbContext 中没有 change 方法。

标签: c# entity-framework


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2013-01-24
    相关资源
    最近更新 更多