Полагаю, вы снова добавляете то, что только что удалили, потому что удаление из DbSet
также удаляет сущность из дочерней коллекции original
. Затем во втором цикле вы снова добавляете объект. Вы можете попытаться уловить эту ситуацию следующим образом:
public void UpdateEntityAttributeAssociations(Model model,
IEnumerable<Entity> current)
{
unitOfWork.Context.Entry(model).Collection(m => m.Entities).Load();
ICollection<Entity> original = model.Entities; // perhaps .ToList() necessary
// delete
List<Entity> toDelete = null;
if (original != null)
{
toDelete = GetToDelete(original, current);
foreach (Entity originalEntityToDelete in toDelete)
{
unitOfWork.Context.Entity.Remove(originalEntityToDelete);
}
}
// add, update
if (current != null)
{
foreach (Entity currentEntity in current)
{
if (toDelete == null || !toDelete.Contains(currentEntity))
{
if (original.Where(originalEntity => originalEntity.IEntity ==
currentEntity.IEntity).FirstOrDefault() == null)
{
model.Entity.Add(currentEntity);
}
}
}
}
}
Я также заменил вашу первую строку явной загрузкой дочерней коллекции, поскольку ваша процедура запроса дочерних сущностей вручную выглядит мне незнакомой, но я не думаю, что это проблема (но я не знаю) .
Редактировать
Я не уверен, поможет ли мой код выше удалить исключение, которое вы имели. Я не знаю, что произойдет, если вы добавите объект в коллекцию, которая уже находится в состоянии Deleted
, и может ли это вызвать это исключение.
Если код не помогает, вы можете проверить, есть ли у вас проблема без второго цикла (Вставка). И как выглядит GetToDelete
точно? А как выглядят ваши Model
и Entity
классы и их отношения? И является ли model.Entity
действительно другой коллекцией, чем model.Entities
(или это опечатка)?