C# 删除EF6中的本地子实体和DB子实体

C# 删除EF6中的本地子实体和DB子实体,c#,winforms,entity-framework,entity-framework-6,master-detail,C#,Winforms,Entity Framework,Entity Framework 6,Master Detail,使用实体框架6,我得到了主实体和细节实体。我有一个WinForm,它在网格中显示给定主实体的详细数据。上下文在表单的整个生命周期中保持不变 详细信息列表通过BindingList绑定到网格: detailBindingSource = new BindingSource(); detailBindingList = new BindingList<Detail>(master.Details); detailBindingSource.DataSource = detailBindi

使用实体框架6,我得到了主实体和细节实体。我有一个WinForm,它在网格中显示给定主实体的详细数据。上下文在表单的整个生命周期中保持不变

详细信息列表通过BindingList绑定到网格:

detailBindingSource = new BindingSource();
detailBindingList = new BindingList<Detail>(master.Details);
detailBindingSource.DataSource = detailBindingList;
detailGrid.SetDataBinding(detailBindingSource, "");
用户完成后,将保存更改:

context.SaveChanges();
如果删除现有行并保存,则所有操作都可以正常工作。如果我删除在表单/上下文的生命周期内添加的行并保存,所有这些都可以正常工作。但如果我同时删除现有行和删除新添加但尚未保存的行,则在保存时会出现以下异常:

System.InvalidOperationException:操作失败:无法更改关系,因为一个或多个外键属性不可为null。对关系进行更改时,相关外键属性设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象

在搜索有关异常的信息时,我发现了一些关于如何从父实体的导航列表中删除不足以删除实体本身的引用,但我认为在上面的代码中调用Remove解决了这一问题,如果我只删除现有行,则似乎是这样


有人知道为什么只有在删除每种类型的行new和old时才会发生异常吗?

在所有三个测试中删除的现有行是否相同?我的意思是,它是同一行,具有相同的基础数据,相同的关系吗?
在第三个测试中,您要删除的现有行似乎与另一个表有关系,而另一个表本身与第三个表有不可为空的关系。当关系取消显示时,第三个表上的对应行也需要删除。

如果您按照应该的方式创建并删除上下文,则不会有任何问题。不要使用全局上下文。

这并不能回答为什么会发生错误,或者为什么在某些情况下不会发生错误,但解决方案是分离数据库中不存在的新添加行:

if (detail.ID > 0)
    dbset.Remove(detail);
else
    dbset.Detach(detail);

谢谢您的建议,但它们是相同的行,并且子行与父行以外的任何其他行都不相关。在创建反父行时是否创建子行?如果是这样,请在删除父记录时尝试显式删除关联的子行。我认为您会遇到此错误,因为您试图删除尚未具有ID的新记录,因为上下文未保存。因此,您添加了一条记录,并尝试从实体中删除DataGridView中存在的某些内容。我保存了行中的任何新行休假事件,如果您想单击“删除”,则可以执行此操作:并且将被删除,因为已保存在上下文中;
if (detail.ID > 0)
    dbset.Remove(detail);
else
    dbset.Detach(detail);