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, който се опитвате да прикачите, препраща ли към поръчка (или друг обект) и поръчка със същия ключ вече е прикачена? Тогава може да е проблем като този: stackoverflow.com/questions/7938728/   -  person Slauma    schedule 14.11.2011
comment
Добро предположение с Order @Slauma. Виждали ли сте моята схема (шега). Сигурно това е благодаря. Но като се има предвид, че случаят е такъв, как мога да прикача елементи от поръчката, ако основната поръчка вече е прикачена и ще причини този проблем. Пропускам ли нещо очевидно?   -  person Crab Bucket    schedule 14.11.2011
comment
Няма да е проблем, ако прикачената поръчка е същият обект като поръчката, посочена от OrderItem. Но тази грешка показва, че имате поръчка (hash=x, key=1), която е прикачена, и друг обект на поръчка със същия ключ (hash=y, key=1). Ако имате това, вие основно трябва да замените отделената поръчка (посочена от OrderItem) с прикачената поръчка ИЛИ да зададете препратката от OrderItem към поръчката на null, преди да прикачите. Моето предположение също може да е грешно, не съм сигурен дали тази грешка за множество екземпляри на IEntityChangeTracker наистина има същата причина като моя свързан отговор.   -  person Slauma    schedule 14.11.2011
comment
благодаря отново за това. Възниква грешка, когато задам някое попълнено свойство за навигация на нула. Ще продължа да разследвам, благодаря   -  person Crab Bucket    schedule 14.11.2011
comment
Може би не позволявате вашите външни ключове да бъдат nullable. Въпреки това, вместо да задавате обекти към вашите свойства за навигация, задайте съответните полета за идентификатор.   -  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