我找不到关于Entity Framework在何时设置外键时查找正确相关对象的好文档。
我正在使用延迟加载(但没有更改跟踪)代理。设置外键,然后获取导航属性值返回null,即使相关导航对象已经加载并存在于DbContext中。
调用DetectChanges可以解决问题,但似乎比较耗费资源。是否有其他方法可以提示Entity Framework进行修复?
我找不到关于Entity Framework在何时设置外键时查找正确相关对象的好文档。
我正在使用延迟加载(但没有更改跟踪)代理。设置外键,然后获取导航属性值返回null,即使相关导航对象已经加载并存在于DbContext中。
调用DetectChanges可以解决问题,但似乎比较耗费资源。是否有其他方法可以提示Entity Framework进行修复?
你说得对。 DetectChanges
是触发关系修复的方法。如果出于任何原因想要进行关系修复,可以调用 DetectChanges
。
但是,当执行以下方法时,EF也会自动调用 DetectChanges
:
(来自 Lerman & Miller 的书籍 DbContext,第 60 页)。
正如你看到的,在设置外键值后,几乎所有与 EF 相关的操作都将调用 DetectChanges
,因此如果之后还有其他有用的操作,请先执行这些操作以节省一次 DetectChanges
调用。
ObjectStateManager
只有一个私有方法AlignChangesInRelationships
,它被用于DetectChanges
中调用。但这确实是最有效的方式,先检测变化,然后修复受这些变化影响的关系。并非所有关系都会受到影响。 - Gert Arnold