2012-12-09 22 views
6

Mam coś takiego jak obiekt klienta z maksymalnie 50000 zamówieniem w ICollection<Orders>. Założono, że Custome jest w lokalnej pamięci podręcznej, a zamówienia nie. Jak mogę usunąć Cutomer i wszystkie powiązane z nim zamówienia bez ładowania wszystkich zamówień klientów do pamięci podręcznej i oznaczania ich za pomocą setDeleted()? Jaka jest tutaj najlepsza praktyka. Zakładam, że najlepszym sposobem jest przedłużenie metody public SaveResult SaveChanges(JObject saveBundle). Jakieś inne możliwości po stronie klienta, takie jak flaga delete_all_navigation_too()?Usuwanie obiektów i ich właściwości nawigacyjnych

Dzięki

Odpowiedz

5

Najprostszym podejściem, które mogę wymyślić, jest utworzenie ograniczenia kaskadowego usuwania w bazie danych, tak aby po usunięciu klienta wszystkie jego zamówienia również zostały usunięte. Następnie po prostu usuń klienta na kliencie i wywołaj "SaveChanges". Ponadto, ponieważ Breeze nie obsługuje jeszcze "kaskadowych" kas po stronie klienta (rozważamy to), będziesz musiał powtórzyć wszystkie zlecenia od strony klienta, które są już załadowane i "odłączyć" je.

+0

Dziękuję wam obu za propozycje. Ponieważ nie mogę przyjąć dwóch odpowiedzi jako poprawnych, wybrałem ten losowo. –

+0

Oh Sascha! Jak mogłeś naskoczyć na mnie Jay? :-) – Ward

+0

Cóż, rzuciłem monetą, dopóki Jay losowo nie wygrał ^^. Sorry Ward, musiałem dać Jayowi kredyt. Twoja reputacja była niesamowita, znaczek tak wysoki, że generał byłby zazdrosny. Następnym razem, gdy wygrasz, obiecuję :) –

6

muszę przypuszczać, że nie masz i nie chcesz usuwać kaskada na swojej bazie danych. Osobiście jestem "przerażony" ogólnie rzecz biorąc usunięciem i staram się ich unikać. Wolę miękkie usuwanie (oznaczenie rekordu jako nieaktywne). Ale nie wszyscy się zgadzają lub mogą podążać za nimi.

Rozważę dodanie do kontrolera metody Web API (powiedz "DeleteCustomerAndOrders"), aby to zrobić. Możesz wywołać dowolną metodę API ze swojego klienta, a nie tylko metodę Breeze.

W tym poleceniu przypuszczam, że takie rzeczy są rzadkością w Twojej aplikacji. Nie potrzebujesz uniwersalnego narzędzia do usuwania, narzędzia, które pobiera tablicę identyfikatorów obiektów nadrzędnych, narzędzie usuwające niektóre obiekty podrzędne, a nie inne, itp. Itp.

Podążaj tą ścieżką, a Ty przeniesie problem z klienta na serwer. To dobrze: nie trzeba było ładować zamówień na kliencie. Teraz musisz się ich pozbyć na serwerze. Jeśli korzystasz z Entity Framework, napotykasz na to samo wyzwanie związane z usuwaniem zamówień bez ich ładowania. Sprawdź rozwiązanie Alexa Jamesa: Bulk-deleting in LINQ to Entities.

Powiązane problemy