使用DbContext和EF Code First更改跟踪差异

时间:2012-06-18 21:20:21

标签: entity-framework

在使用EF Code First时,有两种更改跟踪选项:

  1. 基于快照的更改跟踪
  2. 使用代理进行基于通知的更改跟踪
  3. 使用每种变更跟踪方法运行时,请考虑以下代码。假设具有默认配置选项的DbContext实例。

    var o = context.MySet.First();
    o.MyProperty = 42;
    context.SaveChanges();
    

    如果第一行上下文加载和跟踪的实体实例的“MyProperty”值已经为42,则在第三行调用“SaveChanges”期间,更改跟踪器中的状态不同。

    1. 基于快照的更改跟踪 - 其状态为“未更改”。
    2. 使用代理进行基于通知的更改跟踪 - 其状态为“已修改”。
    3. 鉴于在基于通知的更改跟踪中,在调用“SaveChanges”期间将向数据库发送不必要的更新语句我设想大多数开发人员更喜欢基于快照的更改跟踪的行为。

      这种行为的意义是否有意?

      在使用代理进行基于通知的更改跟踪时,是否有办法实现与基于快照的更改跟踪相同的行为?

      请注意,我认为这与此功能建议有关 - http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1015363-better-change-tracking-for-poco-proxies

1 个答案:

答案 0 :(得分:6)

此行为为intentional。原因是与基于EntityObject的旧实体的行为兼容性相反,它们以相同的方式运行 - 它们将更改属性计数为与实际修改相同的值。链接的文章还显示,新建议仅在快照更改跟踪存在性能问题时才使用快照更改跟踪并选择更改跟踪代理。