2008-10-10 13 views
8

Czy ktoś ma jakieś dobre informacje na temat użycia metody .SaveChanges()?Jaki jest najlepszy sposób użycia metody .SaveChanges() w usługach danych ADO.Net?

Występują różne problemy podczas próby użycia metody .SaveChanges() w moim obiekcie kontekstu danych. Pobieram dane z istniejącego źródła danych, tworząc odpowiednie obiekty EntityFramework/DataService, zapełniając te utworzone obiekty danymi, dodając te obiekty do kontekstu, a następnie zapisując te dane, wywołując .SaveChanges.

Scenariusze, które wymyśliłem (i związane z nimi problemy) są jako takie ... W każdym scenariuszu mam pętlę foreach, która pobiera dane z wierszy w tabeli DataTable i generuje obiekty, dołączając je do kontekstu, kiedy idą. (uwaga: trzy obiekty to "członek" i dwa "adresy", które są dołączone za pośrednictwem wywołania SetLink) - w zasadzie jest to narzędzie do konwersji, które pobiera dane z jednego magazynu danych i masuje je do magazynu danych, który jest udostępniany przez usługi danych.

  • .SaveChanges call() bez parametrów raz na koniec pętli foreach (czyli poza pętlą)
    • OutOfMemory błąd o 1/3 sposób (30,000 poza 90,000 zbawia) - nie wiesz, jak to się dzieje, ponieważ każdy element składowy jest oddzielnym wywołaniem SQL w bazie danych, na którym kończy się pamięć?
  • .SaveChanges call() bez parametrów raz na pętli
    • To działa, ale zajmuje absolutnie zawsze (8 godzin) dla 90,000 zapisuje
  • połączeń .SaveChanges (SaveChangesOption.Batch) raz na koniec pętli foreach
    • sam błąd OutOfMemory, ale bez zapisuje do bazy
  • połączeń .SaveChanges (SaveChangesOption.Batch) raz na pętli
    • 404 nie znaleziono błąd
  • połączeń .SaveChanges (SaveChangesOption.Batch) raz na 10 pętlach
    • 400 błędu Bad Request (okazjonalnie)
    • OutOfMemory po wielu iteracjach
  • Liczba losowych prób utworzenia kontekstu raz na pętlę lub zmienna na początku pętli lub dostępna jako prywatna zmienna składowa.
    • wyniki Odmienne, nie mogąc oszacować, że nikt naprawdę dobry

Jaka jest preferowana metoda wywoływania .SaveChanges() z obiektu klienta, kiedy robi duże obciążenie danych takiego? Czy jest coś, czego nie rozumiem w jaki sposób .SaveChanges() działa? Czy ktokolwiek może podać więcej szczegółów na temat tego, jak należy korzystać z tej funkcji i jakie (jeśli są) ograniczenia w zapisywaniu danych za pośrednictwem usług danych?Czy istnieją jakieś najlepsze praktyki dotyczące wywołania metody .SaveChanges()? Czy jest jakaś szczególnie dobra dokumentacja wywołania metody .SaveChanges()?

+0

jakie "zmiany" wprowadzasz? Dlaczego 90 000 oszczędza? Może powinieneś wypróbować replikację SQL, jeśli tylko przekazujesz dane? tylko myśl. – D3vtr0n

+0

żeby wyjaśnić, kiedy mówisz "raz na pętlę", masz na myśli jedno połączenie na pętlę * iteracja *? – Veverke

Odpowiedz

3

nie mam dużego doświadczenia w korzystaniu EntityFramework (tylko jakiś przypadkowy eksperymentu), czy próbowałeś wzywające .SaveChanges() co n iteracji?

mam na myśli coś takiego:

int i = 0; 
foreach (var item in collection) 
{ 
    // do something with your data 
    if ((i++ % 10) == 0) 
     context.SaveChanges(); 
} 
context.SaveChanges(); 

wiem, że jest brzydki, ale jest to pierwszy z możliwych rozwiązań wymyśliłem.

+0

To wydaje się być jednym z lepszych dostępnych rozwiązań (w szczególności równoważenia zużycia pamięci i prędkości) - wydaje się, że działa lepiej, im większy wykonujesz numer n iteracji (dopóki nie osiągniesz limitu pamięci). nadal nie mam ostatecznej metody, która działa we wszystkich sytuacjach. – ChrisHDog

0

Używam EntityFramework na małym projekcie, więc jestem bardzo zainteresowany również tym pytaniem. Dwa krótkie pytania: Czy próbowałeś odwrócić buforowanie obiektów danych w formacie danych? Czy próbowałeś zamknąć datakontekst i utworzyłeś nowy podczas pętli, aby zwolnić pamięć?

Pozdrowienia

Kenneth

+0

Tworzenie nowego kontekstu podczas pętli powoduje zwolnienie pamięci, która pomaga, ale potem powoduje, że zapisuje się dłużej (wydaje się, że niektóre usprawnienia są przetwarzane przez większe grupy elementów). w jaki sposób jeden obrót buforowania obiektów danych? – ChrisHDog