Используя EntityFramework 6.1.3
, я пытаюсь удалить несколько дочерних элементов из родительского элемента.Приведенный ниже метод используется для обработки одиночного и пакетного удаления.
private async void RemoveItemsFromGroup(object items)
{
var finalItems = new List<RTG_Lookup2_Group_Items>();
var backupGroup = SelectedLookupGroup;
if (items is ItemCollection itemsToRemove)
{
DialogFactory.ShowConfirm("Clear Group", $"Are you sure you wish to remove all items from '{backupGroup.Name}'", "Clear All", willClear =>
{
if (!willClear) return;
var list = itemsToRemove.OfType<RTG_Lookup2_Group_Items>().ToList();
finalItems.AddRange(list);
});
}
else if (items is RTG_Lookup2_Group_Items itemToRemove)
{
finalItems.Add(itemToRemove);
}
_ea.GetEvent<ShowActivityIndicatorEvent>().Publish("Removing Item(s)");
if (finalItems.Any())
await _repository.DeleteItemsFromGroupAsync(backupGroup, finalItems).ConfigureAwait(false);
// Reload Groups
//await LoadGroupsAsync(backupGroup).ConfigureAwait(false);
_ea.GetEvent<HideActivityIndicatorEvent>().Publish();
}
И в методе хранилища
public async Task<int> DeleteItemsFromGroupAsync(RTG_Lookup2_Group parent, List<RTG_Lookup2_Group_Items> items)
{
using (var context = new MarketingEntities())
{
foreach (var item in items)
{
context.Entry(parent).Entity.RTG_Lookup2_Group_Items.Remove(item);
context.RTG_Lookup2_Group_Items.Attach(item);
context.RTG_Lookup2_Group_Items.Remove(item);
}
return await context.SaveChangesAsync();
}
}
Для тестирования при запуске приложения я вставляюстатическая группа с 19 элементами.
Когда я удаляю все объекты, я получаю исключение
System.InvalidOperationException: 'Операция не выполнена: связь не можетбыть изменено, потому что одно или несколько свойств внешнего ключа не могут иметь значение NULL.Когда в отношение вносится изменение, для соответствующего свойства внешнего ключа устанавливается нулевое значение.Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, свойству внешнего ключа должно быть назначено другое ненулевое значение или несвязанный объект должен быть удален. '
Отсюда я подумал, что это одна из моих сущностей, выбрасывающая исключение, поэтому я начал удалять каждую сущность одну за другой, к моему удивлению, ни одна из моих сущностей не выдавала исключение.
Я задавался вопросом, что произойдет, если яудалил и зафиксировал после каждого элемента, поэтому я переписал свой метод репо следующим образом
public async Task<int> DeleteItemsFromGroupAsync(RTG_Lookup2_Group parent, List<RTG_Lookup2_Group_Items> items)
{
using (var context = new MarketingEntities())
{
foreach (var item in items)
{
context.Entry(parent).Entity.RTG_Lookup2_Group_Items.Remove(item);
context.RTG_Lookup2_Group_Items.Attach(item);
context.RTG_Lookup2_Group_Items.Remove(item);
context.SaveChanges(); //<-- save after each item
}
return 0;
}
}
Теперь, когда я запускаю этот метод с пакетным удалением, первый элемент всегда удаляется, аВторой элемент всегда выдает исключение.
Я могу предоставить схему БД, если необходимо, но я не думаю, что это проблема с таблицами, поскольку я могу удалить одну за другой.
E: Схема БД и изображение ниже
