Ошибка LINQ TO SQL: была сделана попытка прикрепить или добавить объект, который не является новым.

«Была сделана попытка прикрепить или добавить объект, который не является новым, возможно, загруженный из другого DataContext. Это не поддерживается».

У меня есть много решений, связанных с методом Attach (), но я просто пытаюсь добавить новую запись. Не уверен что происходит.

Вот мой код, он не работает в строке со звездочкой:

try
            {
                LINQDataContext datacontext = new LINQDataContext();


                TrackableItem ti = datacontext.TrackableItems.FirstOrDefault(_t => _t.pkId == obj.fkTrackableItemId);
                arcTrackableItem ati = new arcTrackableItem();
                ati.barcode = ti.barcode;
                ati.dashNumber = ti.dashNumber;
                ati.dateDown = ti.dateDown;
                ati.dateUp = ti.dateUp;
                ati.fkItemStatusId = ti.fkItemStatusId;
                ati.fkItemTypeId = ti.fkItemTypeId;
                ati.partNumber = ti.partNumber;
                ati.serialNumber = ti.serialNumber;
                ati.archiveDate = DateTime.Now;

                datacontext.arcTrackableItems.InsertOnSubmit(ati);
                datacontext.SubmitChanges();


                arcPWR aItem = new arcPWR();
                aItem.comments = obj.comments;
                aItem.fkTrackableItemId = ati.pkId;
                aItem.fkPWRStatusId = obj.fkPWRStatusId;
                aItem.PwrStatus = obj.PwrStatus;


                **datacontext.arcPWRs.InsertOnSubmit(aItem);**
                datacontext.SubmitChanges();

person Collin Estes    schedule 03.12.2009    source источник


Ответы (4)


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

Быстрое решение может заключаться в передаче dataContext вместо создания нового экземпляра внутри этого метода.

person Mike Fielden    schedule 03.12.2009

Поля, представляющие внешние ключи (например, ati.fkItemStatusId = ti.fkItemStatusId), должны существовать в текущем контексте. Попробуйте что-то вроде этого:

ati.fkItemStatus = dataContext.ItemStatuses.SingleOrDefault(
    d=>d.ItemStatus.ItemStatusId.Equals(ti.fkItemStatusId);

Если вы это сделаете, объект внешнего ключа будет существовать в контексте, потому что вы его вытащили. Не беспокойтесь о падении производительности - он будет заключен в простой оператор SQL.

person baileyrt    schedule 02.10.2010

Что такое «PwrStatus»? Если это объект Linq2SQL, то вы присоединяете этот объект к новому тексту данных, задав ссылку в элементе aItem.

EntityFramework определенно идет вниз по дереву объектов и прикрепляет все объекты к его контексту. Я думаю, что Linq2Sql тоже это делает.

person Arthur    schedule 03.12.2009

Быстрое решение может заключаться в передаче dataContext вместо создания нового экземпляра внутри этого метода.

Если вы сделаете это, вы не сможете отбросить (отменить) изменения в случае возникновения ошибки при нажатии SubmitChanges ().

Вы можете установить внешний ключ любой связи вручную и сразу вызвать SubmitChanges. Если у отношения уже есть определенный внешний ключ, вы получите сообщение об ошибке и вам нужно будет назначить объект. В вашем случае ati.ItemStatus = newItemStatus. Но в этом случае вам нужно сохранить в том же контексте данных, что не позволит вам отменить изменения. :(

person Ivan    schedule 16.06.2010