2012-12-09 99 views
6

我在ICollection<Orders>中擁有類似Customer對象的訂單,訂單最多50000。 假設Custome在本地緩存中,那麼訂單不是。我如何刪除Cutomer及其所有相關訂單,而無需將所有客戶訂單加載到緩存中並用setDeleted()標記它們? 這裏最好的做法是什麼?我認爲延長public SaveResult SaveChanges(JObject saveBundle)方法是最好的方法。客戶端的任何其他可能性,如標誌delete_all_navigation_too()刪除實體及其導航屬性

感謝

回答

5

我能想到的最簡單方法是在數據庫上創建級聯刪除約束,這樣當刪除客戶時,其所有訂單也會被刪除。然後簡單地刪除客戶端上的客戶並調用「SaveChanges」。此外,由於Breeze尚不支持客戶端'級聯'刪除(我們正在考慮這一點),您需要遍歷已加載並「分離」它們的任何客戶端訂單。

+0

謝謝你們的提案。由於我無法接受兩個正確的答案,所以我隨機選擇了這個答案。 –

+0

哦薩沙!你怎麼能挑我傑伊?:-) – Ward

+0

嗯,我扔硬幣,直到傑伊隨機贏得^^。對不起沃德,我不得不給傑伊信用。你的聲望很高,一般的徽章數量會很嫉妒。下次你贏了,我保證:) –

6

我必須假設你沒有,不想級聯您的數據庫中刪除。就個人而言,我一般會「害怕」刪除,並儘量避免它們。我更喜歡軟刪除(將記錄標記爲非活動狀態)。但不是每個人都同意或可以效仿

我會考慮添加一個Web API方法(比如說「DeleteCustomerAndOrders」)到您的控制器來執行此操作。您可以從客戶端調用任何API方法,而不僅僅是Breeze方法。

在推薦這個,我假設這種事情是在你的應用程序相對罕見。你不需要一個通用的刪除器,一個需要父對象ID數組的刪除器,將刪除一些子對象而不是其他的刪除器......等等。

按照這條路徑和你將問題從客戶端轉移到服務器。這很好:您不必在客戶端上加載訂單。現在你必須在服務器上擺脫它們。如果您使用實體框架,您將面臨同樣的挑戰,即在不加載訂單的情況下刪除訂單。查看Alex James的解答:Bulk-deleting in LINQ to Entities