2010-02-04 61 views
0

的我也有類似的標準產品/訂單明細/ Order設置的模式。我想刪除一個產品並級聯刪除引用該產品的所有OrderDetails。實體框架的缺失非空的外國鍵控行

假設我已經從業務規則的角度通過這個思想,什麼是處理與實體框架4最優雅的方式?

+1

是否有任何理由,你不能'在數據庫中刪除級聯'? – 2010-02-04 19:26:10

+0

我試圖不這樣做,其他原因,但我同意這是最好的答案,如果可能的話。 – 2010-02-04 19:54:38

回答

1

的第一件事是先:

有沒有在數據庫級別任何理由on delete cascade將無法​​正常工作?

如果這真的不是一個可能性,你可以嘗試以下方法:

由於ObjectContext沒有DeleteAll風格的方法......你總是可以實現自己:

public static void DeleteAll(this ObjectContext context, 
    IEnumerable<Object> records) 
{ 
    foreach(Object record in records) 
    { 
     context.DeleteObject(record); 
    } 
} 

然後你可以寫下類似的東西(可能在一個版本庫中):

context.DeleteAll(context.OrderDetails.Where(od => od.Product == product)); 

或者,是一個小清潔工:

var toDelete = context.OrderDetails.Where(od => od.Product == product); 

context.DeleteAll(toDelete); 
+0

你在評論中的想法比你的答案更清晰。外匯基金應該注意到級聯和「只是工作」。 http://blogs.msdn.com/alexj/archive/2009/08/19/tip-33-how-cascade-delete-really-works-in-ef.aspx – 2010-02-04 19:37:26

+1

@Craig我只張貼的答案,因爲我沒有對我的評論沒有任何迴應。我會更新我的帖子。 – 2010-02-04 19:42:04

+0

謝謝 - 如果可能的話,我認爲可以使用刪除級聯編輯,否則手動刪除級聯關係總結得很好。 – 2010-02-04 19:55:58