Entity Framework - дублирование связанных объектов при вызове SaveChanges внутри вставки - PullRequest
0 голосов
/ 25 августа 2011

Я создаю новую родительскую сущность с новой дочерней сущностью на стороне клиента. Это отношения один ко многим.

//Client has created a new Parent with a new Child attached 
//e.g. Parent.Child = new Child();
//This is submitted to the server, and ends up here:
public void InsertParent(Parent parent)
{ 
    ObjectContext.Parents.AddObject(parent); //No Parent.ID yet
    ObjectContext.SaveChanges(); //Now I have a Parent.ID

    //Do some stuff with the Parent.ID here. (Nothing is changed with the Parent or Child, just using Parent.ID)
}

Моя проблема заключается в том, что после всего этого я получаю в базе данных две дочерние сущности. Я предполагаю, что EF уже имеет вставку для дочерней очереди, и когда я вызываю SaveChanges, он создает другую вставку для той же дочерней сущности.

Причина, по которой у меня есть SaveChanges, заключается в том, что я хочу кое-что сделать с Parent.ID после создания родителя, но мне нужно сохранить Parent до того, как он получит ID (первичный ключ создается БД). Когда я беру весь свой дополнительный код (из SaveChanges и далее), все работает как положено.

Ответы [ 2 ]

1 голос
/ 09 сентября 2012

Я понимаю, что этот пост очень старый, но я сталкиваюсь с той же проблемой и не нашел способ обойти ее.Я использую WPF с Binding.Я пытаюсь вставить одну запись истории, которая связана с несколькими дочерними таблицами.В итоге я убедился, что дети также не вставлены:

Parent.ChildID = Parent.Child.ChildID;
Parent.Child = null;

Это похоже на полный взлом, но это работает.

0 голосов
/ 25 августа 2011
  • Поставьте точку останова в этом методе, чтобы подтвердить, что в Parent есть только один дочерний элемент.
  • Вернитесь сразу после SaveChanges (), чтобы подтвердить, что ни один из ваших «вещей» не вносит никаких других изменений
  • Убедитесь, что ObjectContext создан и правильно утилизирован. Почему этот метод не создает экземпляр контекста - откуда он взялся?

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

Ваша операция должна принимать Parent with Child, просто создать экземпляр контекста и вставить. Если вы можете подтвердить, что он просто делает это, вы, скорее всего, найдете свою проблему.

...