К вашему последующему вопросу:
... как мы можем сохранить навигационные свойства, а НЕ
замените (или потеряете) их на NULL, когда мы отсоединяемся от контекста ...
Я считаю, что невозможно отделить граф объекта от контекста, сохраняя его свойства навигации. Из MSDN :
В независимой ассоциации информация об отношениях не является
поддерживается для отдельного объекта.
Хотя это утверждение относится к независимым ассоциациям, это не означает, что свойства навигации поддерживаются в ассоциации внешнего ключа (отношения, которые предоставляют свойство внешнего ключа в модели). Да, «информация об отношениях» сохраняется, потому что свойства внешнего ключа (которые являются скалярными свойствами) будут действующими и будут содержать правильное значение внешнего ключа после отсоединения. Но соответствующие свойства навигации по-прежнему будут null
для ссылочных свойств или, для навигационных коллекций ссылка будет удалена из коллекции.
Я думаю, что единственный способ отсоединить полный граф объектов от контекста - это либо полностью удалить контекст, либо создать копию графа перед началом отсоединения исходного графа. Создание копии потребует написания Clone
методов, которые копируют все свойства и перемещаются по графику, или используют «трюк», такой как this , который сериализует график в двоичный поток и затем десериализует его обратно в новые объекты. , Для этого сущности должны быть сериализуемыми. Также ссылочные циклы (которые мы часто имеем при использовании свойств двунаправленной навигации между объектами) могут вызвать проблемы. (Также обратите внимание, если ваши объекты являются прокси-серверами, которые содержат ссылки на внутренние объекты EF и которые вы, вероятно, не хотите копировать, сериализовать и десериализовать.)
В этом аспекте Detach
не является аналогом Attach
, поскольку он ведет себя совершенно иначе: Attach
присоединяет весь граф объекта и поддерживает свойства навигации. Detach
отсоединяет только отдельные объекты без связанных объектов и уничтожает свойства навигации. С той же страницы, на которую ссылаются выше:
Отсоединение влияет только на конкретный объект, переданный методу. Если
отсоединяемый объект имеет связанные объекты в контексте объекта, те
объекты не отделены.
Я мог бы представить, что это главная причина, по которой API DbContext
не имеет явного Detach
метода (в отличие от ObjectContext
) - отсоединение рассматривается как расширенная функция, которая не ведет себя как единое целое. можно ожидать.
MSDN упоминает в качестве единственной причины отсоединения объекта от контекста "для сохранения ресурсов" (снова статья выше):
В приложениях Entity Framework вы можете отсоединять объекты от
контекст объекта. Вы можете отсоединить объекты для сохранения ресурсов, как
выполнение повторных запросов в одном и том же контексте объекта увеличивает
Требования к памяти для контекста объекта.
Я думаю, что этот метод просто не подготовлен и предназначен для работы с объектами после того, как они были отделены от контекста. Его главная цель - освободить их для немедленной сборки мусора.