EF4 не может добавить объект в контекст, хотя я уверен, что он не прикреплен

Я не могу добавить объект в ObjectContext, хотя я уверен, что он не прикреплен и не связан с другим контекстом.

Я использую EF 4 с объектами POCO.

Если я попытаюсь

_currentContext.ObjectStateManager.GetObjectStateEntry(entityIn)

Затем я получаю ошибку

The ObjectStateManager does not contain an ObjectStateEntry with a reference to an object of type 'System.Data.Entity.DynamicProxies.OrderItem_7D361CB49D75AA90681B4BA3F924139ECB0FC1426E38E90C7B884A4E9CD777DF'.

Справедливо его нет. Поэтому, если я попытаюсь прикрепить его

_currentContext.AttachTo("OrderItems", entityIn)

Тогда я получаю

An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

Как я могу получить обе ошибки. Не противоречат?? Как я могу привязать его к контексту?

Изменить

Во всем приложении есть только один контекст. Шаблон

  1. Все вызовы через объекты репозитория.
  2. Объекты получают свой объектный контекст из фабричного класса.
  3. Этот фабричный класс либо создает контекст, либо получает контекст из объекта запроса, что гарантирует использование только одного контекста для жизненного цикла страницы.

В любой момент, если вы возьмете два экземпляра объекта контекста, хэш-код для каждого будет одинаковым.


person Crab Bucket    schedule 14.11.2011    source источник
comment
Ваш OrderItem, который вы пытаетесь прикрепить, ссылается на Заказ (или другой объект), а Заказ с тем же ключом уже прикреплен? Тогда это может быть такая проблема: false для прикрепленного объекта"> stackoverflow.com/questions/7938728/   -  person Slauma    schedule 14.11.2011
comment
Хорошая догадка с Order @Slauma. Вы видели мою схему (шутка). Вот, пожалуй, спасибо. Но, учитывая это, как я могу прикрепить элементы заказа, если базовый заказ уже прикреплен и вызовет эту проблему. Я пропустил что-то очевидное?   -  person Crab Bucket    schedule 14.11.2011
comment
Это не будет проблемой, если присоединенный Order будет тем же самым объектом, что и Order, на который ссылается OrderItem. Но эта ошибка указывает на то, что у вас есть Order (хэш = x, ключ = 1), который прикреплен, и другой объект Order с тем же ключом (хэш = y, ключ = 1). Если у вас есть это, вы в основном должны заменить отдельный заказ (на который ссылается OrderItem) прикрепленным заказом ИЛИ установить ссылку из OrderItem на заказ на null, прежде чем прикреплять. Мое предположение также может быть ошибочным, я не уверен, действительно ли эта ошибка о нескольких экземплярах IEntityChangeTracker имеет ту же причину, что и мой связанный ответ.   -  person Slauma    schedule 14.11.2011
comment
еще раз спасибо за это. Это ошибка, когда я устанавливаю для любого заполненного свойства навигации значение null. буду продолжать расследование спасибо   -  person Crab Bucket    schedule 14.11.2011
comment
Возможно, вы не разрешаете своим внешним ключам быть обнуляемыми. Тем не менее, вместо того, чтобы устанавливать объекты для ваших свойств навигации, установите соответствующие поля идентификатора.   -  person Nelson Reis    schedule 14.11.2011


Ответы (1)


Объект entityIn, вероятно, имеет ссылку на объект, который находится в другом контексте.

Однако настоящая проблема заключается в том, что у вас вообще несколько контекстов в области видимости. трудно сделать это правильно. В веб-приложении у вас должен быть один контекст на запрос, и точка.

person Craig Stuntz    schedule 14.11.2011
comment
Я использую Ninject для обслуживания одного контекста для каждого запроса во всех моих репозиториях. Работает как шарм. Однако любой контейнер IoC должен выполнять эту работу. - person Morten Christiansen; 14.11.2011
comment
Спасибо за ваш комментарий @Craig Stuntz. В приложении есть только один контекст, связанный с объектом запроса, как вы предлагаете. Я отредактировал вопрос, чтобы сделать это более понятным - person Crab Bucket; 16.11.2011
comment
Если вы получаете несколько экземпляров ошибки IEntityChangeTracker, то у вас действительно задействовано несколько контекстов, точка. Эта ошибка не означает ничего другого; есть только одна вещь, которая вызывает это. Просто объект, находящийся в другом контексте, не является entityIn; это какой-то объект, с которым связан entityIn. - person Craig Stuntz; 16.11.2011
comment
Хорошо, я признаю, что ты прав @Craig Stuntz, хотя мне потребовалось много времени, чтобы понять это. Хотя контекст обслуживается фабричным методом, и для каждого запроса существует только один контекст, проблема заключалась в том, что у меня был объект, сохраненный в сеансе, и именно он выдавал эту ошибку. Урок, извлеченный из этого, заключается в том, чтобы не сохранять сущности в сеансе, поскольку они приводят к взрыву кода, как это - person Crab Bucket; 22.11.2011