EF исправляет отношения (свойства навигации) автоматически в соответствии со значениями первичного ключа и внешнего ключа при загрузке объекта из базы данных или при его присоединении к контексту.
В обоих фрагментах кода вы загрузили record
, который имеет внешний ключ для вашего ForeignKeyTable
. Контекст знает это значение. (Между прочим, не имеет значения, если вы выставили внешний ключ в вашей модели. Он всегда будет загружаться, также без свойства FK в вашей модели. Это можно увидеть, наблюдая за запросом SQL.)
В обоих случаях вы потом присоединяете сущность ForeignKey
к контексту, который имеет в качестве первичного ключа значение record.ForeignKeyId
, о котором контекст уже знает. Как следствие, EF установит свойство навигации record.ForeignKey
для этой присоединенной ForeignKey
сущности.
Очевидно, IsLoaded
не сообщает вам, присоединена ли сущность к контексту, потому что в обоих примерах она присоединена, но один возвращает true
, а другой false
. Это также не говорит вам, относится ли record.ForeignKeyId
к сущности, потому что это также имеет место в обоих примерах.
Это говорит вам, очевидно, только о том, что сущность действительно была загружена из базы данных (и не только присоединена вручную) (что также Intellisense говорит о IsLoaded
). Это единственная разница между вашим первым и вторым примером.
И кажется, что отложенная загрузка контролируется не только флагом IsLoaded
. Если вы присоединяете объект для свойства навигации к контексту, отложенная загрузка больше не происходит, хотя IsLoaded
равно false
.
Что произойдет, если ваша последняя строка во втором фрагменте кода фактически вызовет отложенную загрузку? Загружаемый объект ForeignKey
должен иметь тот же ключ, что и объект ForeignKey
, который вы уже прикрепили (поскольку record
имеет это значение как свойство FK ForeignKeyId
). Но поскольку никакие два объекта с одинаковым ключом не могут быть присоединены к контексту, это должен быть один и тот же объект. Но тогда нет необходимости загружать его, так как такой объект уже находится в памяти и подключен.