entity-framework - DbContext 和 EF Code First 的更改跟踪差异

标签 entity-framework

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

  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

最佳答案

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

关于entity-framework - DbContext 和 EF Code First 的更改跟踪差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11091263/

相关文章:

database - 数据库中已经有一个名为的对象

c# - 是否可以设置 Entity Framework 提供程序将执行的实际 SQL?

sql - 在 Entity Framework 中锁定表

c# - 如何在 linq 或 lambda 表达式中使用 having、group by 和 distinct

entity-framework - 如何在 DB first 方法中为实体设置创建日期和修改日期

c# - 如何使用扩展方法加入 .NET Entity Framework 中的多个列?

c# - 如何在控制台应用程序中为连接字符串定义数据目录以使用 Entity Framework 代码优先迁移

entity-framework - EF Code First 迁移在 Azure Web 角色上抛出 StackOverflowException

c# - 使用Entity Framework查询多表联合结果

.net - Azure Net 后端发布,我必须在添加另一个迁移之前确实删除迁移吗?