Entity Framework Присоединить исключение после клонирования - PullRequest
2 голосов
/ 27 октября 2010

После опробования нескольких вариантов наличия приличного механизма, который позволяет использовать ObservableCollections с возможностью их динамического обновления с использованием окна редактирования и привязки, без обновления глобальных коллекций при внесении изменений в связанные элементы управления, пока что лучшийРешение выглядит следующим образом: клонируйте объект, отсоедините старый, прикрепите новый, отметьте его как обновленный и сохраните.

Но, к сожалению, следует следующее исключение:

The relationship manager supplied by the object implementing IEntityWithRelationships is not the expected relationship manager.

Кто-тознает, как решить эту проблему?

btw - Пожалуйста, не предлагайте использовать сериализацию, ни отражение, ни клонер сущностей Matthieu MEZIL из-за проблем с производительностью (копирование всего графа сущностей занимает несколько секунд).Спасибо, Оран

Ответы [ 2 ]

2 голосов
/ 31 октября 2010

Приведенный выше ответ (Slappy) привел меня к решению.Вот полное объяснение:

  1. Чтобы отредактировать сущность и не воздействовать на связанные с ней элементы управления наблюдаемыми, я просто хотел клонировать сущность, внести изменения, присоединить ее кконтекст объекта и сохранить.Но я ударился головой о стену, так как мне не удалось выполнить эту, так называемую, простую операцию при использовании .NET MemberWiseClone () по умолчанию или любой другой процедуры клонирования, которую я обнаружил.

  2. Когда я сериализовал объект, у меня все получилось, но с одной большой проблемой: потребовалось несколько секунд для сериализации объекта, что было невозможно из-за проблем с производительностью.

  3. Затем SlappyОтвет привел меня к осознанию того, что я недостаточно изучил поведение Object Context и то, как оно обрабатывает модель сущностей.Когда я внимательно посмотрел на документы и проследил за поведением сущности, я понял, что я противоречу сам себе - я попытался выполнить Глубокий клон на «живой» и «присоединенной» контекстной сущности, что заняло несколько секунд в паре размероммои данные.

  4. Следующая процедура решила мою проблему: я загрузил (ВЕЛИКИЙ!) клонер сущностей из Matthieu MEZIL (http://msmvps.com/blogs/matthieu/archive/2008/05/31/entity-cloner.aspx) и использовал CloneEntityWithGraph, чтобы полностьюклонировать сущность, но на этот раз с одним отличием: я отделил сущность, прежде чем пытаться ее клонировать.Разумеется, сущность была мгновенно клонирована со всем ее графом таким образом, чтобы ее можно было впоследствии применить к исходной сущности следующим образом.После внесения изменений я использовал следующий код для успешного сохранения изменений:

    objectContext.ApplyCurrentValues(<ObjectSet Name>,<Cloned And Edited Entity>); objectContext.SaveChanges();

Вот и все!Объект был успешно сохранен в базе данных.

Я предпочитаю этот подход из подхода POCO или из жесткого кодирования редактирования свойств конкретного объекта, поскольку он является общим и (должен) быть применимым ко всем моим объектам сЛюбое конкретное кодирование для сущности.

Спасибо за помощь, Оран

2 голосов
/ 28 октября 2010

Я бы поставил под сомнение ваш подход. «Копирование всего графа сущностей занимает несколько секунд» должно вызывать тревожные звонки. Похоже, вы храните большую часть своих данных в памяти. То, что ты можешь, не означает, что ты должен. Я бы попробовал перепроектировать, вы используете отложенную загрузку.

Однако, как говорится, используете ли вы разъединенные сущности (подход POCO)? Это может помочь в этом отношении, так как они больше отделяются от контекста, и это может дать вам гибкость, позволяющую вывести сущности в контекст и из контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...