DbContext的ChangeTracker问题

时间:2011-04-27 19:40:05

标签: code-first entity-framework-4.1

我有一个基于Codefirst EF-4.1的程序。用户获取上下文并可以修改某些属性。用户完成后,我会快速执行

ChangeTracker.Entries().Any(e => e.State != EntityState.Unchanged);

确定是否需要SaveChanges()。如果我执行'SaveChanges()'调用,则所做的更改将持久保存到数据库中。

这适用于某些属性,不适用于其他属性。具体来说,它似乎适用于简单类型(float s)和集合层次结构(ObservableCollection s)。

我做错了吗?

1 个答案:

答案 0 :(得分:5)

是的,这是一个问题。 DbChangeTracker不跟踪某些关系。 Independent association and Foreign key association之间存在差异。在以下情况下跟踪对关系的更改:

  • 一对一关系,始终是EFv4 +中的外键关联
  • 与外键关联的一对多关系 - 您应该设置外键属性

以下情况不会跟踪对关系的更改:

  • 与独立协会的一对多关系
  • 多对多关系,始终是独立关联

未跟踪独立关联的命名不正确。跟踪了这些更改,但DbChangeTracker does not expose access to these changes!您必须将DbContext转换为ObjectContext并使用ObjectStateManager访问代表独立协会的ObjectStateEntries

在这种情况下,最简单的事情就是始终致电SaveChanges。如果不需要保存数据,它将不会执行任何数据库命令。