跟踪 POCO 实体中的更改(实体框架)

跟踪 POCO(“纯旧式”CLR 对象)实体中的更改有两种方法:通过更改跟踪代理对象或通过快照。

使用代理进行更改跟踪

为 POCO 实体启用更改跟踪代理对象创建后,在对对象图进行更改时,实体框架 将自动跟踪所做的更改。 有关更多信息,请参见创建 POCO 代理的要求(实体框架)标识解析、状态管理和更改跟踪(实体框架)。 如果不能满足 POCO 类中的附加要求,或者不希望将这些代理对象具体化,则可以禁用代理类生成。 有关更多信息,请参见使用 POCO 实体(实体框架)

使用快照跟踪更改

如果禁止创建代理对象,在对对象图进行更改时,实体框架 不会自动跟踪所做的更改。 必须改用 DetectChanges 方法报告更改。

将对象附加到上下文后,将拍摄该对象的属性值的快照。 调用 DetectChanges 方法后,附加的对象图将与 ObjectStateManager 同步。 有关如何附加对象的信息,请参见附加和分离对象(实体框架)DetectChanges 方法通过执行以下操作将对象图与状态管理器进行同步:

  1. 在图中向对象上下文附加新的对象。 如果查询主体对象并创建与新的依赖对象的关联,将会执行此操作。

  2. 将当前属性值与原始值的快照(如果已拍摄快照)进行比较,据此更新对象的状态。

有关更多信息,请参见如何:检测 POCO 实体中的更改

Dd456848.note(zh-cn,VS.100).gif注意:
如果 POCO 实体包含复杂类型属性,即使该实体具有更改跟踪代理,也将通过快照方法来检测对复杂类型实例的成员的更改。但是,如果将复杂类型的新实例分配给某个属性,则将采用与其他属性相同的方法跟踪该属性的更改。

如果对象与 ObjectStateManager 不同步,使用 ObjectStateManager 的其他操作(例如,添加、附加或删除对象;调用 Refresh 方法;甚至使用 PreserveChangesMergeOption 值执行查询)可能会产生不可预知的结果。

由于保持 ObjectStateManager 与附加的 POCO 实体值的任何更改同步非常重要,默认情况下,SaveChanges 方法将首先调用 DetectChanges 方法。 如果对图进行了更改并计划使用以下任一方法,在调用 SaveChanges 前,我们建议您调用 DetectChanges

另请参见

概念

使用 POCO 实体(实体框架)