Подтвердить что ты не робот

Нарушение множественности. Роль "..." отношения "..." имеет кратность 1 или 0..1

Я получаю следующую ошибку из моего DbContext: "Нарушение множественности ограничено. Роль" MyEntity "отношения" MyModel.FK_ChildEntities_MyEntities "имеет множественность 1 или 0..1.

с использованием ASP.NET, Entity Framework 4

Работа с отдельным объектом

Ошибка происходит во второй раз, когда я пытаюсь повторно привязать объект к dbcontext. Сценарий - неудачное сохранение, за которым следует повторная попытка.

У меня есть отдельный элемент в сеансе. Пользователь изменяет свойства в форме, добавляет вещи, удаляет вещи и, наконец, сохраняет их. Я получаю прикрепленную копию объекта из нового экземпляра dbcontext, применяю изменения от отдельного объекта к прикрепленному объекту, проверяю, обнаруживаю ошибку и прерываю. Пользователь меняет все и сохраняет снова.

Во втором сохранении повторяется весь процесс сохранения, только на этот раз все идет в ад. В значительной степени все дублируется, вызывая одну ошибку или все или все из них. Значения из представлений и таблиц поиска, которые должны только быть ссылками, создаются новыми и переназначенными идентификаторами. Большинство из тех проблем, которые я смог решить, но я остался с ошибкой множественности. Детальные элементы создаются как точные копии других дочерних элементов, вплоть до уникального идентификатора, только в добавленном состоянии. Или, если я ссылаюсь на определенные свойства, вместо клонирования немодифицированного ребенка, он отбрасывает новый. В любом случае, ни один из кода не выполняется, как в первый раз.

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

Код (очень упрощенный) выглядит примерно так:

void Save()
{
using (var context = new MyContext())
{
   // detached entity from session
   MyEntity detachedEntity = (MyEntity)Session["DetachedEntity"];

   // attached entity from context
   MyEntity attachedEntity = context.MyEntities.Single(x=>x.id == detachedEntity.id);       


   // <remove children representing lookup table elements from detachedEntity to prevent duplicates>
   // <remove children representing view elements from detachedEntity to prevent duplicates>


   // <apply changes from detachedEntity to attachedEntity>


   // <add new children>
   // <remove deleted children>
   // <update modified children>


   // <set entity state to unchanged on view and lookup elements of attachedEntity to ensure no duplicates...>


   // <validate>


   if (errors.count>0)
     // <report errors>
   else
     context.SaveChanges();
}
}

это порождает ошибку множественности:

// represents first save:
    using (var context = new MyContext())
    {
       // detached entity from session
       MyEntity detachedEntity = (MyEntity)Session["DetachedEntity"];

       // attached entity from context
       MyEntity attachedEntity = context.MyEntities.Single(x=>x.id == detachedEntity.id);       

       int debug1 = context.ChangeTracker.Entries<ChildEntity>().Count(); // debug1 == 0;

       attachedEntity.ChildEntities.Add(detachedEntity.ChildEntities.First());

       int debug2 = context.ChangeTracker.Entries<ChildEntity>().Count(); // debug2 == 1;

    }

// represents second save:
    using (var context = new MyContext())
    {
       // detached entity from session
       MyEntity detachedEntity = (MyEntity)Session["DetachedEntity"];

       // attached entity from context
       MyEntity attachedEntity = context.MyEntities.Single(x=>x.id == detachedEntity.id);    

       int debug1 = context.ChangeTracker.Entries<ChildEntity>().Count(); // debug1 == 0;

       attachedEntity.ChildEntities.Add(detachedEntity.ChildEntities.First());

       int debug2 = context.ChangeTracker.Entries<ChildEntity>().Count(); // multiplicity error;

    }
4b9b3361

Ответ 1

каким-то образом dbcontext запоминает, какие объекты были добавлены к нему. если тот же самый объект появляется дважды, он... дует

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

ChildEntity detachedChild = detachedEntity.ChildEntities.First();
attachedEntity.ChildEntities.Add(new ChildEntity { 
   propertyA = detachedChild.propertyA,
   propertyB = detachedChild.propertyB
});

вместо

attachedEntity.ChildEntities.Add(detachedEntity.ChildEntities.First());

Ответ 2

Проблема заключается в том, что detachedChild.parent должен быть назначен attachParent.

foreach(var detachedEntity in detachedEntities)
{
     attachedEntity.ChildEntities.Add(detachedEntity); 
     detachedEntity.ParentEntity = attachedEntity;
}

Ответ 3

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

Ответ 4

Обновление EF 6

Для меня настройка состояния объекта добавлена ​​обработанная звуковая логика также

ChildEntity detachedChild = detachedEntity.ChildEntities.First();
var newChild = new ChildEntity { 
   propertyA = detachedChild.propertyA,
   propertyB = detachedChild.propertyB
});

// Mark all added entity entity state to Added
 attachedEntity.ChildEntities.Add(newChild );
                        db.Entry(newChild ).State = EntityState.Added;

http://www.entityframeworktutorial.net/EntityFramework4.3/update-one-to-many-entity-using-dbcontext.aspx

Ответ 5

Я испытал эту ошибку, когда у меня были свойства навигации, которые не были установлены или свойства навигации, которые принадлежали неправильному коду First DBContext