savechanges()也保存BindingList的已删除对象

本文关键字:删除 对象 BindingList 保存 savechanges | 更新日期: 2023-09-27 18:18:21

我希望你能帮我解决这个问题,我整晚都在挠头,想弄清楚这个bug是在哪里出现的。

我正在用winform写一个发票应用程序。

我在表单上有一个网格,其数据源设置为BindingList对象。

我们就这样写:

BindingList<InvoiceLine> MyInvoiceLines = new BindingList<InvoiceLine> { };
Invoice MyInvoice = new Invoice();

InvoiceLine和Invoice都是模型中的实体对象。

我通过:

为网格添加线条
MyInvoiceLines.Add(new InvoiceLine());

我通过:

从网格中删除线条
MyInvoiceLines.Remove(LineToBeRemoved);

其中linetobermoved是一个属性,当用户想要删除一行时,它会获取选中的行…

最后我想保存发票,所以我这样做…

 foreach(var line in MyInvoiceLines)
{
   MyInvoice.InvoiceLines.Add(line);
}

然后调用SaveChange()。然而,从InvoiceLines BindingList中删除的行也被保存…我一直在挠头,试图解决这个问题,因为在我的代码中从开始到结束没有InvoiceLines集合被引用或与数据上下文对象连接之前,这个方法最终动作保存。

这是我的代码的简化版本,但我不禁认为我必须得到一些概念上的错误与BindingList或数据上下文对象。这对我来说真的不太明显,因为我是个新手。

任何帮助将不胜感激,不是修复后,也许一些工具或方法,我可以进一步诊断这个问题…

更新:在添加到BindingList之前分离项目似乎固定它,但从实体中删除对象有奇怪的行为:/谢谢大家。

savechanges()也保存BindingList的已删除对象

您可以尝试显式删除该对象。例如

foreach(var object in deletedObjectCollection)
{
     _currentContext.DeleteObject(order);
}

而不是依赖它在集合中不存在来激活删除。根据我的经验(使用EF4),这不起作用。我使用延迟加载,集合中对象的缺失可能是因为它还没有被加载,所以依赖它的缺失感觉不对。可能(几乎肯定)有更优雅的方法来做到这一点,但它目前正在为我工作。

一般来说,我必须对EF做比我想象的更显式的处理。

已从BindingList中删除的实体,也已从DBContext中分离?

如果实体仍然依附于上下文,它仍然会被跟踪,因此更改将被保存。

我认为你必须为未改变的记录设置一个脏标志,然后在Entity.SaveChages()事件中检查它。

你做过很多次吗?您可以将所有的InvoiceLine项目添加到您的Invoice中,然后从BindingList中删除一些项目(不是您的实际实体!),然后将它们重新添加到您的实体中。

我想(但老实说,我对这一点有点不确定)当主键匹配时,重复项不会保存两次。但是,应该删除的项仍然存在。

如果您的Invoice对象是Entity对象,它是上下文感知的,并将被上下文跟踪。调用SaveChanges()将保存所有Entity对象的所有更改,除非它们被分离。

请记住,如果您将这些Entity对象关联到对象图,并将对象图的任何节点附加到上下文,则整个图将被附加。所以如果你创建一个新的实体对象,比如InvoiceLine,你把这个新的InvoiceLine和一个对象图联系起来:

MyInvoiceLines.Add(new InvoiceLine());

此时上下文应该跟踪整个图