2014-06-30 5 views
5

Jestem całkowicie nowy w Entity Framework, więc proszę wybaczyć, jeśli moja logika jest przekrzywiona/to jest sposób, w jaki rzeczy już działają, ale pracuję nad aplikacją, w której :Entity Framework - Efektywnie usuń wszystkie encje podrzędne bez ich ładowania

  1. przechowywać Informacje dla rodziców w jednej tabeli z kluczem podstawowym = ParentId
  2. Dla każdego ParentId, przechowywać tysiące rekordów w tabeli podrzędnej z relacji klucza obcego jeden-do-wielu na parentId.

Więc, jeśli informacja się nie zmienia dla rodzica (który może zdarzyć się dość często), co chciałbym zrobić, to mieć swój program wykonać równowartość:

DELETE FROM ChildTable WHERE ParentId = 'xx' 

Przed aktualizacją dziecko tabela z nowymi/zaktualizowanymi wartościami dla tego samego ParentId.


Z tego co widziałem, tak bym zrobił to albo:

  • umieścić w rzeczywistej polecenia SQL za pomocą ctx.Database.ExecuteSqlCommand() kind-of-concept
  • na pewnym poziomie , w rzeczywistości przechodzimy przez elementy potomne i ustawiamy je do usunięcia przed aktualizacją kontekstu bazy danych (co wydaje się być bardzo nieefektywne, ponieważ przypuszczam, że będzie musiało je pobrać z bazy danych, aby to zrobić i wszystko czego chcę zrobić to po prostu usunąć je wszystkie).

Jaki jest prawidłowy sposób to zrobić w EF w najbardziej efektywny sposób możliwe?

+0

Ewentualny duplikat http://stackoverflow.com/questions/2519866/how-do-i-delete-multiple-rows-in-entity-framework- without -foreach – Stilgar

+0

@Stilgar, dzięki za wskazanie tego, zrobiłem zobacz to pytanie, ale nadal jestem zdezorientowany (może to, czego potrzebuję, to tylko więcej wyjaśnień), czy to pociągałoby za sobą zapętlenie wszystkich elementów dziecka czy nie ... Ta część wciąż nie ma dla mnie sensu ... –

+1

Jeśli martwisz się o wydajność, wystarczy napisać procedurę składowaną lub surowy SQL. EF ma doskonałe wsparcie w tym zakresie. – Stilgar

Odpowiedz

2

Usuwanie zbiorcze i każda aktualizacja zbiorcza jest ograniczeniem domyślnego zachowania Entity Framework. Jednym z zadań jest użycie tej biblioteki rozszerzeń, która pozwala na te polecenia masowe bez konieczności wciągania elementów do pamięci, aby je usunąć.

https://github.com/loresoft/EntityFramework.Extended. Ma również dobrą dokumentację na tej stronie, opisującą sposób korzystania z różnych funkcji.

+0

Dziękujemy! - Po prostu ciekawy, nie ma nic wbudowanego w EF6, które już to robi, prawda? –

+1

Nie to, co wiem, a szybkie wyszukiwanie google niczego nie zmieniło. co oznacza prawdopodobnie nie. To, co udało mi się znaleźć, mówiło, że to poza zakresem tego, co EF próbował zrobić, czyli ścisłym mapowaniem obiektów. mam nadzieję, że pomaga. – Madullah

+0

Jeśli pytasz, ponieważ nie chcesz mieć biblioteki innej firmy, FWIW możesz napisać te rozszerzenia samodzielnie. pytanie SO w komentarzach miało drugorzędną odpowiedź pokazującą przykładowy kod dla zbiorczego usunięcia. – Madullah

3

W przypadku prostych usuwania zbiorczych zwykle wydaje się bezpośrednio instrukcję SQL. tj:

context.Database 
    .ExecuteSqlCommand("DELETE FROM TheTable Where MyColumn = {0}", parameter); 

Jeśli potrzebujesz bardziej zaawansowanej pomocy technicznej, działa również druga odpowiedź Ef Eff. Jest to prosty sposób wykonywania prostych zapytań, które nie wymagają dodatkowych zależności.

Należy jednak pamiętać, że wewnętrzna pamięć podręczna DbContext może nie być zsynchronizowana z bazą danych. Więc po wykonaniu takiego polecenia, najlepiej nie robić żadnych zapytań związanych z obiektami, dopóki nie stworzysz nowego kontekstu.

+0

Wielkie dzięki, Erik, myślałem, że to sposób na zrobienie tego, po prostu nowość w EF, miałem nadzieję, że już zaprogramowali coś, co wydaje się być tak konieczne ... I szczególnie dziękuję za podpowiedź używając tego samego kontekstu ... Jestem pewien, że będzie bardzo przydatny !! –

+0

Jeszcze jedno pytanie - Czy biorąc pod uwagę swoją wiedzę, wolałbyś to zrobić tak, jak pisałeś lub czy procedura składowana byłaby lepsza? –

+1

@JohnBustos - W procedurze przechowywanej jest bardzo mało wartości dla czegoś tak prostego, chyba że firma wymaga ich użycia. –