2013-04-03 60 views
1

可以說我有以下兩個實體:EF 4刪除相關項目

Item 
int Id 
ICollection<ChildItem> ChildItems 

ChildItem 
int Id 
Item ParentItem 

(上刪除級聯從項目到ChildItem設定,無論是在EF設計和SQL服務器上) ,我有一些像這樣的代碼:

Item newItem = new Item(); 
ChildItem child1 = new ChildItem(); 
ChildItem child2 = new ChildItem(); 
newItem.ChildItems.Add(child1); 
newItem.ChildItems.Add(child2); 
myContext.Items.AddObject(newItem); 
// Then much, much further down the line 
myContext.Items.DeleteObject(newItem); 

現在,沒有EF自動找出它也有刪除的子項,或者我應該刪除他們自己?

事情是,我的刪除代碼工作正常,如果我添加一個SaveChanges()在DeleteObject之前,但如果我試圖先刪除,然後保存更改,我傾向於得到一些「無法確定主要結束關聯「 - 概念。現在,我正在用EF 4試圖這樣做。對於EF5,我只是使用context.Local -property來代替,但現在我不太確定EF 4用實體狀態Added添加的對象。

回答

1

也許改變newItem的狀態爲Unchanged將做的伎倆。

但我會採取不同的方法。顯然你正處於一個決定哪些新項目最終將被提交給數據庫的過程。我會使用這些項目的一個簡單的本地List<T>,並且最初只添加/刪除列表中的項目。最後,當所有內容都被整理出來後,您將其餘項目添加到myContext.Items並保存更改。它也將減少開銷,因爲更改跟蹤器不會太忙。

+0

是的,很好的發現,我完全忘了解釋過程的一部分。事情是,我的實際案例包含舊的(從數據庫中讀取)和新的(最近創建的,尚未保存的)實體。但即便如此,只需將所有新創建的項目保存在一個單獨的列表中,我可以從中刪除它們,然後在保存之前瀏覽列表看起來確實是一個合理的選項。謝謝! – bobblez