Я получаю следующую ошибку из моего 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;
}