Posty

Wyświetlanie postów z sierpień, 2018

Entity Framework - dodawanie / import wielu rekordów naraz

Od czasu do czasu musimy wstawić do bazy wiele rekordów naraz, najczęściej w przypadku importu/aktualizacji danych. Jest wiele sposobów na wykonanie tej czynności, ale najprościej stworzyć DbContext, dodać elementy do kolekcji, a następnie zapisać za pomocą SaveChanges. Gdy korzystamy z Entity Framework 6, istnieje kilka zasad, których powinniśmy przestrzegać, aby wydajnośc rozwiązania była przyzwoita: Ustawienie context.Configuration.AutoDetectChangesEnabled na false . Domyślnie Entity Framework używa wykrywacza zmian, aby wygenerować odpowiednie skrypty SQL przy zapisywaniu zmian. Gdy dodajemy rekordy do bazy, to wiemy, że nie ma zmian. Nie ma potrzebu zatrudniania wykrywacza, który w EF 6 zużywa sporo zasobów. Trzeba go wyłączyć. Dzielenie danych na partie. Jeżeli chcemy wstawić do bazy np. 10000 rekordów, lepiej podzielić je na partie i wywoływać SaveChanges() po dodaniu każdej z nich. Jaka powinna być wielkość jednej partii? Może być np. 100, ale to trzeba wydedukować samemu,

Entity Framework - inserting large number of rows

From time to time we have to insert a large number of rows into the database, usually because of data import. There are many ways to do it, but the simplest one is to take DbContext, add into the collection, and call SaveChanges. When we use Entity Framework 6 or less, there are a few important rules to follow: Setting context.Configuration.AutoDetectChangesEnabled to false . By default Entity Framework uses change tracker to find all changes made to entities, to generate SQL scripts later. But all we do is make inserts so we know there are no changes, only new rows. There is no need to compare with existing items so change tracker can be disabled. Splitting inserts into batches.  If you want to insert 10000 rows into the database, it is better to split them into small batches and call context.SaveChanges() after every n rows where n should be determined experimentally. 100 isn't bad value, but it depends on the size of data. Recreating DbContext after every batch.  Even if