2011-12-19 24 views
1

我希望你能幫助我,我一整晚都在摸頭,試圖找出這個錯誤持續存在的地方。Entity.SaveChanges()還保存BindingList的已刪除對象?

我正在用winform編寫一個開發票申請表。

我在窗體上有一個網格,其數據源設置爲BindingList對象。

就讓我們沿着它的線條是:

BindingList<InvoiceLine> MyInvoiceLines = new BindingList<InvoiceLine> { }; 

Invoice MyInvoice = new Invoice(); 

兩個InvoiceLine和發票都在我的模型實體對象。

MyInvoiceLines.Add(new InvoiceLine()); 

我刪除通過從網格線:

我通過增加線網格

MyInvoiceLines.Remove(LineToBeRemoved); 

哪裏LineToBeRemoved是獲取在使用時要刪除所選行的屬性線等...

所以最終我想保存發票,所以我這樣做...

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

然後調用SaveChange()。然而,從InvoiceLines BindingList中刪除的行也被保存...我一直在摸我的腦袋,試圖解決這個問題,因爲我的代碼中沒有WHERE從頭到尾InvoiceLines集合被引用或與數據上下文連接在這個方法之前的對象最終會保存。

這是我的代碼的簡化版本,但我不禁想到我必須在BindingList或數據上下文對象的概念上有錯誤。對我來說,這真的不明顯,因爲我是一個小菜鳥。

任何幫助,將不勝感激,而不是一個解決方法,也許一些工具或方法,我可以進一步診斷這個問題......之後

更新:增加了的BindingList看似固定之前分離的項目,但從實體中刪除對象具有奇怪的行爲:/謝謝大家。

+2

請發表您的代碼和發生錯誤,以及在什麼condtions告訴我們。 – 2011-12-19 12:52:43

+0

對不起,我點擊提交過早。我已經更新了OP。讓我知道你是否需要更多信息。 – Rillanon 2011-12-19 13:04:21

+0

您是否檢查'MyInvoiceLines.Remove(LineToBeRemoved)'實際上是否工作,並且您的foreach循環中的MyInvoiceLines確實不再包含已刪除的項目? – Slauma 2011-12-19 15:18:45

回答

0

已經從BindingList中移除的實體,還有從DBContext中分離出來的蜜蜂嗎?

如果實體仍附加到上下文,它仍將被跟蹤,因此更改將被保存。

+0

我試着調用entity.InvoiceLines.detach(LineToBeRemoved),但它仍然保存...事情是實體從未打算在保存方法之前附加。移除方法在此之前發生。 – Rillanon 2011-12-19 13:08:29

0

我認爲你必須爲未改變的記錄設置一個髒標誌,然後在Entity.SaveChages()事件中檢查它。 可能對您有幫助...

+0

謝謝,能否詳細說一下?對不起,我是小白。 – Rillanon 2011-12-19 13:08:55

1

您可以嘗試刪除對象。即

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

而不是依靠它缺少一個集合來激活刪除。根據我的經驗(與EF4),這是行不通的。我使用延遲加載,並且集合中缺少對象可能是因爲它尚未加載,所以它不適合依賴它。有可能(幾乎肯定)更優雅的方式來做到這一點,但它目前正在爲我工​​作。

一般我已經做了很多更明確地與EF比我以爲我。

+0

我試圖明確地刪除,但現在刪除的對象被添加,並且NON-removed被刪除wtf .... lol也許是時候重寫這整個事情了。 – Rillanon 2011-12-19 13:36:35

+0

Oh no @Rillanon。你確定你有兩個建立的集合,並刪除正確的?顯而易見 - 抱歉。此外 - 不漂亮,但嘗試在每個刪除循環後調用saveChanges只是爲了看看是否有訣竅。刪除對象的電話應該可以工作 – 2011-12-19 13:48:45

+0

只需再次檢查...不要只是一個集合,這是在做我的頭:(哦,好時間睡覺,晚上晚上,謝謝大家的幫助! – Rillanon 2011-12-19 14:04:29

0

你這樣做了多次?你可能已經添加了所有InvoiceLine項目的Invoice,然後取出一些來自BindingList(而不是實際的實體!),然後將它們重新添加到您的實體。

我想,(但說實話,我對於這點有點不確定)作爲主鍵匹配,重複不保存兩次。但是,應該刪除的項目仍然存在。

0

如果您Invoice對象是Entity對象是上下文感知,並通過上下文進行跟蹤。調用SaveChanges()將保存所有Entity對象的所有更改,除非它們已分離。

請記住,如果將這些Entity對象與對象圖相關聯,並將對象圖的任何節點附加到上下文中,整個圖將被加密。所以,如果你創建一個新的實體對象,像一個InvoiceLine和您聯繫這個新InvoiceLine到對象圖:

MyInvoiceLines.Add(new InvoiceLine()); 

整個圖形應該在這一點上的情況下進行跟蹤。

相關問題