Вы используете это правильно. Единственный способ программно включить или отключить создание прокси-сервера - установить ContextOptions.ProxyCreationEnabled
в false
или true
, как вы делаете в данный момент.
Я не думаю, что есть способ обернуть десериализованную сущность в прокси-объект. Проблема в том, что прокси - это динамически создаваемый тип (= тип, созданный во время выполнения), полученный из вашего типа сущности. Поэтому, если вы десериализуете его в свой тип сущности, вы не сможете привести его к другому типу.
Вероятно, может работать использование прокси-серверов, но отключение LazyLoading
(также в ContextOptions
) и ручное отсоединение сущностей от контекста, который их загружает. Но это нарушит все отношения, и вам все равно придется прикрепить объект к новому контексту и установить его состояние. Другое решение, которое может работать, - это создание новой сущности с помощью context.CreateObject
и копирование всех данных из кэшированной сущности в новую, но это решение, которое мне не нравится.
Сказано другими словами: как только вы работаете с отсоединенными сущностями, вы должны иметь дело с присоединением и настройкой состояния вручную. Это еще хуже, если вы собираетесь изменить отношения .
Btw. вы упомянули об использовании EFv4.1, но все, что вы используете, - это EFv4. EFv4.1 не внес никаких изменений в API ObjectContext, он добавил другой API DbContext, поэтому, если вы не преобразуете DbContext
обратно в ObjectContext
, вы используете EFv4. Если вы приведете DbContext
обратно к ObjectContext
, вам следует проверить API DbContext, поскольку он предлагает эквиваленты Attach
или ChangeObjectState
=> DbSet.Attach
и context.Entry(entity).State
.