2012-06-18 111 views
6

当涉及到使用EF代码第一次有两个选项更改跟踪:更改跟踪差异用的DbContext和EF代码第一次

基于更改跟踪
  1. 快照
  2. 通知基于更改跟踪与代理

使用每种更改跟踪方法运行时请考虑以下代码。假设一个带有默认配置选项的DbContext实例。

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

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

  1. 基于快照的更改跟踪 - 其状态为“未更改”。
  2. 基于通知的变更跟踪与代理 - 其状态是“修改”。

鉴于在基于通知的变更跟踪下,在调用“SaveChanges”期间不必要的更新语句将被发送到数据库我认为大多数开发人员更喜欢基于快照的变更跟踪行为。

这是行为故意的差异吗?

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

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

回答

6

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