【问题标题】:EntityState.Detached, do I need to reload?EntityState.Detached,我需要重新加载吗?
【发布时间】:2012-11-28 01:25:25
【问题描述】:

全部,

首先使用 .Net 4 和 EF 4.4 数据库。

假设我有一个 DbContext。我从这个 DbContext 加载数据,做一些事情,然后从 DbContext 中分离所有内容并处理 DbContext。

然后,我创建一个新的 DbContext(相同模型)并加载与第一个 DbContext 中的数据重叠的其他数据。在执行我的查询之前,我是否需要执行 Entry().Reload() 或者 Detatched Entities 在加载到新上下文时是否会自动刷新。

我问的原因是因为我过去遇到了一个问题,当使用相同的 DbContext 时,我必须手动重新附加处于分离状态的实体并调用 Reload。所以我想知道在这种情况下,与先前 DbContext 处于分离状态的实体是否只是简单地附加到新的 DbContext 或者它们是否也被刷新了?

是的,我知道我可以设置一个简单的测试,但我很想知道是否有其他人已经这样做了,以便他们可以与 SO Universe 分享他们的发现并避免其他人对此感到疑惑。

希望这个问题有意义。

谢谢。

【问题讨论】:

    标签: entity-framework-4


    【解决方案1】:

    实体不会自动附加到新上下文。您必须手动附加它们。如果您只是加载重叠数据,您的实体将不会更新。您必须通过调用 Reload 或使用 ObjectContext 和 MergeOption 进行查询来强制进行此类更新。如果您不附加分离的实体,而只是在新上下文中运行查询,您将获得新数据,但您将拥有两个重叠实体的实例 - 一个与旧数据分离,一个与新数据附加。

    【讨论】:

    • 谢谢。那么,根据您的回答,并注意到我正在使用 DbContext,从已处置的 DbContext 中分离的实体在什么时候会被 GCed?如果我有一个新的 DbContext,那么我不希望数据保留,因为即使查询拉入重叠数据,服务器也可能会更新这些记录。
    • 谢谢拉迪斯拉夫。我玩弄了它,并没有在 ObjectContext (EF 4.4) 中看到 MergeOption。但是,请参阅我提供的答案,它在扩展方法中使用 ObjectSet.MergeOption,如果您发现这种方法存在任何缺陷,请告诉我。谢谢。
    • 其实,我刚刚发现 ObjectSet 不能从 DbSet 或 DbQuery 转换。不过,我想我的直接问题已经解决了,但是如果我们可以像使用 ObjectSet 一样在 DbSet 中设置 MergeOption 那就太好了。
    【解决方案2】:

    分离的实体在加载到新上下文时会自动刷新吗?

    不,他们不会。这很好,因为您可以附加更改的实体(这通常发生在断开连接的 n 层应用程序中)。自动刷新将删除更改。因此,如果您想刷新,则必须手动重新加载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2011-03-05
      • 2021-11-05
      相关资源
      最近更新 更多