Ten sam temat został omówiony tutaj 8 miesięcy temu: How do I speed up DbSet.Add()?. Nie zaproponowano rozwiązania innego niż użycie SqlBulkCopy, co jest dla nas nie do przyjęcia. Postanowiłem raz jeszcze poruszyć tę kwestię, mając nadzieję, że pojawią się nowe myśli i pomysły dotyczące tego problemu i zaproponowane zostaną inne rozwiązania. Przynajmniej jestem po prostu ciekawy, dlaczego ta operacja trwa tak długo.Dlaczego DbSet.Add działa tak wolno?
Problem polega na tym, że muszę zaktualizować jednostki 30K do bazy danych (EF 4.1, POCO). Typ encji jest dość prosty i zawiera liczbę całkowitą Id + pozostałe 4 właściwości liczb całkowitych bez relacji z innymi typami. 2 przypadki:
wszystkie to nowe rekordy. Uruchamianie context.Entities.Add (entity), jeden po drugim dla każdej jednostki, zajmuje 90 sekund z Cntx.Configuration.AutoDetectChangesEnabled = false (true value powoduje, że działa ona zawsze). Następnie SaveChanges zajmuje tylko sekundę. Inne podejście: dołączenie go do kontekstu jak to ma taką samą 90 sek:
Cntx.Entities.Attach(entity); Cntx.Entry(entity).State = EntityState.Added;
wszystko im są istniejące rekordy z pewnymi zmianami. W przypadku trwa zaledwie kilka milisekund, aby dołączyć go do istniejącego kontekstu danych tak:
Cntx.Entities.Attach(entity); Cntx.Entry(entity).State = EntityState.Modified;
Zobacz różnicę?
Co kryje się za sceną metody Add, która sprawia, że działa ona tak niesamowicie wolno?
Połóż aktualizację jako odpowiedź proszę. –
Próbowałem, ale nie mogłem tego zrobić, potrzebnych było 100 punktów reputacji (9 więcej), aby uzyskać odpowiedź samemu. – YMC
Wznowiłem twoje pytanie, teraz masz 101 powtórzeń :) – Slauma