使用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和下面的图片