C# Entity.SaveChanges()还保存BindingList的已删除对象吗?
我希望你能帮我解决这个问题,我整晚都在挠头,想弄清楚这个bug到底在哪里 我正在用winform编写一个发票应用程序 我在表单上有一个网格,其数据源设置为BindingList对象 让我们按照以下思路来做:C# Entity.SaveChanges()还保存BindingList的已删除对象吗?,c#,.net,entity-framework,bindinglist,C#,.net,Entity Framework,Bindinglist,我希望你能帮我解决这个问题,我整晚都在挠头,想弄清楚这个bug到底在哪里 我正在用winform编写一个发票应用程序 我在表单上有一个网格,其数据源设置为BindingList对象 让我们按照以下思路来做: BindingList<InvoiceLine> MyInvoiceLines = new BindingList<InvoiceLine> { }; Invoice MyInvoice = new Invoice(); 我通过以下方式从网格中删除线: MyInv
BindingList<InvoiceLine> MyInvoiceLines = new BindingList<InvoiceLine> { };
Invoice MyInvoice = new Invoice();
我通过以下方式从网格中删除线:
MyInvoiceLines.Add(new InvoiceLine());
MyInvoiceLines.Remove(LineToBeRemoved);
其中LineToBeRemoved是一个属性,用于在用户希望删除行等时获取所选行
所以最终我想保存发票,所以我这样做
foreach(var line in MyInvoiceLines)
{
MyInvoice.InvoiceLines.Add(line);
}
然后调用SaveChange()。但是,从InvoiceLines绑定列表中删除的行也会保存。。。我一直在绞尽脑汁试图解决这个问题,因为在我的代码中,从开始到结束,InvoiceLines集合都没有在这个最终执行保存操作的方法之前被引用或连接到数据上下文对象
这是我的代码的简化版本,但我忍不住想,BindingList或data context对象在概念上一定有问题。这对我来说并不明显,因为我是个笨蛋
任何帮助将不胜感激,不是在修复之后,也许是一些工具或方法,我可以进一步诊断这个问题
更新:在添加到BindingList之前分离该项似乎修复了它,但从实体中删除该对象有奇怪的行为:/Thank Every 已从BindingList中删除的实体是否也已从DBContext中分离
如果该实体仍然附加到上下文,它仍将被跟踪,因此更改将被保存。从绑定列表中删除的实体至少也已从DBContext中分离
如果实体仍然附加到上下文,它仍将被跟踪,因此更改将被保存。我认为您必须为未更改的记录设置一个脏标志,然后在entity.SaveChages()事件中检查它。
这可能对您有所帮助…我认为您必须为未更改的记录设置一个脏标志,然后在Entity.SaveChages()事件中检查它。
这可能对您有所帮助…您可以尝试明确删除对象。i、 e
foreach(var object in deletedObjectCollection)
{
_currentContext.DeleteObject(order);
}
而不是依靠它在集合中的缺失来激活删除。根据我的经验(EF4),这是行不通的。我使用延迟加载,集合中缺少对象可能是因为它还没有加载,所以依赖它的缺少感觉不正确。有可能(几乎可以肯定)更优雅的方法来做到这一点,但它目前正在为我工作
一般来说,我必须比我想象的更明确地使用EF。您可以尝试明确地删除对象。i、 e
foreach(var object in deletedObjectCollection)
{
_currentContext.DeleteObject(order);
}
而不是依靠它在集合中的缺失来激活删除。根据我的经验(EF4),这是行不通的。我使用延迟加载,集合中缺少对象可能是因为它还没有加载,所以依赖它的缺少感觉不正确。有可能(几乎可以肯定)更优雅的方法来做到这一点,但它目前正在为我工作
一般来说,我必须对EF进行比我想象的更明确的操作。您多次这样做吗?您可能已将所有
发票行
项目添加到您的发票
,然后从绑定列表
(不是您的实际实体!)中删除一些项目,然后将它们重新添加到您的实体中
我想(但老实说,我有点不确定这一点)当主键匹配时,副本不会保存两次。但是,应该删除的项目仍然存在。您多次这样做吗?您可能已将所有
发票行
项目添加到您的发票
,然后从绑定列表
(不是您的实际实体!)中删除一些项目,然后将它们重新添加到您的实体中
我想(但老实说,我有点不确定这一点)当主键匹配时,副本不会保存两次。但是,应该删除的项目仍然存在。如果您的
发票
对象是一个实体
对象,它是上下文感知的,将由上下文跟踪。调用SaveChanges()
将保存所有实体
对象的所有更改,除非它们已分离
请记住,如果将这些实体
对象关联到对象图,并将对象图的任何节点附加到上下文,则整个图都将被附加。因此,如果创建一个新的实体对象,如InvoiceLine
,并将此新的InvoiceLine
与对象图关联:
MyInvoiceLines.Add(new InvoiceLine());
此时应通过上下文跟踪整个图形。如果您的
发票
对象是一个实体
对象,则它是上下文感知的,并将通过上下文跟踪。调用SaveChanges()
将保存所有实体
对象的所有更改,除非它们已分离
请记住,如果将这些实体
对象关联到对象图,并将对象图的任何节点附加到上下文,则整个图都将被附加。因此,如果创建一个新的实体对象,如InvoiceLine
,并将此新的InvoiceLine
与对象图关联:
MyInvoiceLines.Add(new InvoiceLine());
此时应按上下文跟踪整个图表。请发布代码,并告诉我们错误发生的位置和条件。很抱歉,我太早点击了“提交”。我已经更新了OP。如果您需要更多信息,请告诉我。您是否检查了
MyInvoiceLines.Remove(LineToBeRemoved)
实际工作,并且您的foreach循环中的MyInvoiceLines
确实不再包含删除的项目?请发布您的代码,并告诉我们错误发生的位置和条件。抱歉,我太早点击了提交。我已经更新了OP。如果您需要更多信息,请告诉我。您是否检查了MyInvoiceLines.Remove(LineToBeRemov