Проблема с добавлением нескольких дочерних объектов в существующую сущность в EF - PullRequest
1 голос
/ 07 июня 2011

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

    Parent parenttoModify = new Parent();
    parenttoModify.Parent_Id = 5; //this comes from some Index of a dropdown or a key column of a grid, i Have put a dummy value here for example
    parenttoModify.Children.Add(child);
    parenttoModify.Children.Add(child2);
    DataAccess.ModifyParent(parenttoModify); 

В моем слое доступа к данным у меня есть такой метод:

public static bool ModifyParent(Parent parent)
        {
            int recordsAffected=0;
            using (TestEntities testContext = new TestEntities())
            {

                testContext.Parents.Attach(parent);
                var parentEntry = testContext.ObjectStateManager.GetObjectStateEntry(parent);
                parentEntry.ChangeState(System.Data.EntityState.Modified);
                recordsAffected =  testContext.SaveChanges();
            }
            return recordsAffected > 0 ? true : false;

        }

Я получаю сообщение об ошибке при вызове testContext.Parent.Attach (parent). Там написано:

Объект с таким же ключом уже существует.

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

Есть идеи, где я иду не так?

1 Ответ

2 голосов
/ 07 июня 2011

Куда вы добавляете детей? Я полагаю, вы не показываете весь код. Когда вы вызываете Attach или AddObject EF всегда присоединяет или добавляет все объекты из графа объектов, которые не известны (отслеживаются) к контексту в данный момент. Исключение говорит о том, что некоторая сущность - возможно, родительская - уже отслеживается контекстом. Итак, у вас есть:

  • Используется общий контекст (вы создаете новый экземпляр в ModifyParent, поэтому он не должен быть регистром)
  • Сначала загрузить родительский элемент из контекста в ModifyParent
  • Вызывается Attach или AddObject на любом дочернем элементе до присоединения родителя.

Все эти операции приводят к исключению, которое вы получаете.

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