Entity framework 首先更改与DbContext和EF代码的跟踪差异

Entity framework 首先更改与DbContext和EF代码的跟踪差异,entity-framework,Entity Framework,首先使用EF代码时,有两种更改跟踪选项: 基于快照的更改跟踪 使用代理进行基于通知的更改跟踪 使用每种更改跟踪方法运行时,请考虑以下代码。假设一个具有默认配置选项的DbContext实例 var o = context.MySet.First(); o.MyProperty = 42; context.SaveChanges(); 如果由第一行上的上下文加载和跟踪的实体实例的“MyProperty”的值已经为42,那么在调用第三行上的“SaveChanges”期间,其在更改跟踪器中的状态不同

首先使用EF代码时,有两种更改跟踪选项:

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

    var o = context.MySet.First();
    o.MyProperty = 42;
    context.SaveChanges();
    
    如果由第一行上的上下文加载和跟踪的实体实例的“MyProperty”的值已经为42,那么在调用第三行上的“SaveChanges”期间,其在更改跟踪器中的状态不同

  • 基于快照的更改跟踪-其状态为“未更改”
  • 使用代理进行基于通知的更改跟踪-其状态为“已修改”
  • 考虑到在基于通知的更改跟踪下,在调用“SaveChanges”期间将向数据库发送不必要的更新语句,我认为大多数开发人员更喜欢基于快照的更改跟踪行为

    这种行为差异是故意的吗

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

    请注意,我认为这与此功能建议有关-

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