为什么我的批量删除会在逐个删除时抛出异常

时间:2018-06-06 19:29:26

标签: c# wpf entity-framework entity-framework-6

使用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:&#39;操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。&#39;

从这里开始,我认为这是我的一个实体抛出异常,所以我开始逐个删除每个实体,令我惊讶的是,我的实体都没有抛出异常。

我想知道如果我在每个项目之后删除并提交会发生什么,所以我将我的repo方法重写为以下

    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:DB Schema和下面的图片

enter image description here

0 个答案:

没有答案