我希望你能帮我解决这个问题,我整晚都在挠头,想弄清楚这个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之前分离项目似乎固定它,但从实体中删除对象有奇怪的行为:/谢谢大家。
您可以尝试显式删除该对象。例如
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());
此时上下文应该跟踪整个图