Программное включение / отключение прокси-серверов - PullRequest
5 голосов
/ 19 апреля 2011

Я использую Entity Framework 4.1 с объектами POCO в новом проекте. Все работало нормально, пока я не начал кэшировать сущности с помощью AppFabric Caching. Я начал получать ошибки при извлечении энтита из кэша, связанного с десериализацией прокси-объектов. Я исправил эту проблему, установив ContextOptions.ProxyCreationEnabled = false. Теперь проблема в том, что когда я возвращаю сущности из кеша, мне нужно присоединить сущность к текущему контексту с помощью ObjectSet.Attach (entity) и добавить их в диспетчер состояний с помощью ObjectContext.ObjectStateManager .ChangeObjectState (entity, EntityState.Modified) .

У меня вопрос, есть ли способ программно включить / отключить прокси для набора сущностей? Или, другими словами, способ обернуть десериализованную сущность в прокси-объект.

Если нет хорошего способа сделать это, правильно ли я сейчас это делаю? Или есть лучший способ?

1 Ответ

8 голосов
/ 20 апреля 2011

Вы используете это правильно. Единственный способ программно включить или отключить создание прокси-сервера - установить 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.

...