什么触发实体框架来修复导航属性?

时间:2013-12-19 21:28:24

标签: entity-framework

我找不到关于究竟是什么让实体框架决定在设置外键时查找正确的相关对象的好文档。

我正在使用延迟加载(但不是更改跟踪)代理。设置外键然后获取导航属性值将返回null,即使相关的导航对象已加载并位于DbContext中。

调用DetectChanges有效,但似乎很重。在Entity Framework中是否还有其他方法可以解决问题?

2 个答案:

答案 0 :(得分:4)

你是对的。 DetectChanges是触发关系修复的方法。如果您希望因任何原因发生关系修复,请致电DetectChanges

但是当您执行以下方法时,EF本身也会调用DetectChanges

  • DbSet.Add
  • DbSet.Find
  • DbSet.Remove
  • DbSet.Local
  • DbContext.SaveChanges
  • DbSet.Attach
  • DbContext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries
  • 针对DbSet运行任何LINQ查询

(来自Lerman& Miller的书 DbContext ,第60页)。

如您所见,在设置外键值后,您将使用EF进行的几乎任何操作都将调用DetectChanges,因此如果您之后还有其他有用的事情要做,请先执行以下操作并保存一个{{ 1}}来电。

答案 1 :(得分:0)

使用变更跟踪实体时,在设置了另一个导航时,将固定一对导航属性中的一个。例如,假设有一个从Post到Blog的主体导航,而从Blog到Post有一个从属集合属性。如果您使用的是变更跟踪实体,则设置post.Blog = blog也将导致blog.Posts.Add(post)。如果您习惯在SaveChanges之前在代码中同时执行post.Blog = Blog和Blog.Posts.Add(post),则可能会造成混淆。当您使用DetectChanges时,这是无害的,但是当使用变更跟踪实体时,您将在SaveChanges之前在blog.Posts集合中获得该帖子的两个副本。